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
967561f8
Commit
967561f8
authored
Jan 07, 2011
by
Jacek Caban
Committed by
Alexandre Julliard
Jan 10, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shdocvw: Separate DocHost ref count from InternetExplorer ref count.
parent
b0ba945e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
130 additions
and
39 deletions
+130
-39
client.c
dlls/shdocvw/client.c
+2
-2
ie.c
dlls/shdocvw/ie.c
+15
-6
iexplore.c
dlls/shdocvw/iexplore.c
+86
-30
shdocvw.h
dlls/shdocvw/shdocvw.h
+13
-1
webbrowser.c
dlls/shdocvw/webbrowser.c
+14
-0
No files found.
dlls/shdocvw/client.c
View file @
967561f8
...
...
@@ -83,13 +83,13 @@ static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID ri
static
ULONG
WINAPI
ClientSite_AddRef
(
IOleClientSite
*
iface
)
{
DocHost
*
This
=
impl_from_IOleClientSite
(
iface
);
return
IDispatch_AddRef
(
This
->
disp
);
return
This
->
container_vtbl
->
addref
(
This
);
}
static
ULONG
WINAPI
ClientSite_Release
(
IOleClientSite
*
iface
)
{
DocHost
*
This
=
impl_from_IOleClientSite
(
iface
);
return
IDispatch_Release
(
This
->
disp
);
return
This
->
container_vtbl
->
release
(
This
);
}
static
HRESULT
WINAPI
ClientSite_SaveObject
(
IOleClientSite
*
iface
)
...
...
dlls/shdocvw/ie.c
View file @
967561f8
...
...
@@ -49,7 +49,7 @@ static HRESULT WINAPI InternetExplorer_QueryInterface(IWebBrowser2 *iface, REFII
*
ppv
=
&
This
->
IWebBrowser2_iface
;
}
else
if
(
IsEqualGUID
(
&
IID_IConnectionPointContainer
,
riid
))
{
TRACE
(
"(%p)->(IID_IConnectionPointContainer %p)
\n
"
,
This
,
ppv
);
*
ppv
=
&
This
->
doc_host
.
cps
.
IConnectionPointContainer_iface
;
*
ppv
=
&
This
->
doc_host
->
doc_host
.
cps
.
IConnectionPointContainer_iface
;
}
else
if
(
HlinkFrame_QI
(
&
This
->
hlink_frame
,
riid
,
ppv
))
{
return
S_OK
;
}
...
...
@@ -79,8 +79,17 @@ static ULONG WINAPI InternetExplorer_Release(IWebBrowser2 *iface)
TRACE
(
"(%p) ref=%d
\n
"
,
This
,
ref
);
if
(
!
ref
)
{
DocHost_Release
(
&
This
->
doc_host
);
if
(
This
->
doc_host
)
{
DocHost_Release
(
&
This
->
doc_host
->
doc_host
);
if
(
This
->
doc_host
)
This
->
doc_host
->
ie
=
NULL
;
}
if
(
This
->
frame_hwnd
)
DestroyWindow
(
This
->
frame_hwnd
);
heap_free
(
This
);
released_obj
();
}
return
ref
;
...
...
@@ -140,7 +149,7 @@ static HRESULT WINAPI InternetExplorer_GoHome(IWebBrowser2 *iface)
{
InternetExplorer
*
This
=
impl_from_IWebBrowser2
(
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
go_home
(
&
This
->
doc_host
);
return
go_home
(
&
This
->
doc_host
->
doc_host
);
}
static
HRESULT
WINAPI
InternetExplorer_GoSearch
(
IWebBrowser2
*
iface
)
...
...
@@ -159,7 +168,7 @@ static HRESULT WINAPI InternetExplorer_Navigate(IWebBrowser2 *iface, BSTR szUrl,
TRACE
(
"(%p)->(%s %p %p %p %p)
\n
"
,
This
,
debugstr_w
(
szUrl
),
Flags
,
TargetFrameName
,
PostData
,
Headers
);
return
navigate_url
(
&
This
->
doc_host
,
szUrl
,
Flags
,
TargetFrameName
,
PostData
,
Headers
);
return
navigate_url
(
&
This
->
doc_host
->
doc_host
,
szUrl
,
Flags
,
TargetFrameName
,
PostData
,
Headers
);
}
static
HRESULT
WINAPI
InternetExplorer_Refresh
(
IWebBrowser2
*
iface
)
...
...
@@ -294,7 +303,7 @@ static HRESULT WINAPI InternetExplorer_get_LocationURL(IWebBrowser2 *iface, BSTR
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
LocationURL
);
return
get_location_url
(
&
This
->
doc_host
,
LocationURL
);
return
get_location_url
(
&
This
->
doc_host
->
doc_host
,
LocationURL
);
}
static
HRESULT
WINAPI
InternetExplorer_get_Busy
(
IWebBrowser2
*
iface
,
VARIANT_BOOL
*
pBool
)
...
...
@@ -473,7 +482,7 @@ static HRESULT WINAPI InternetExplorer_Navigate2(IWebBrowser2 *iface, VARIANT *U
return
E_INVALIDARG
;
}
return
navigate_url
(
&
This
->
doc_host
,
V_BSTR
(
URL
),
Flags
,
TargetFrameName
,
PostData
,
Headers
);
return
navigate_url
(
&
This
->
doc_host
->
doc_host
,
V_BSTR
(
URL
),
Flags
,
TargetFrameName
,
PostData
,
Headers
);
}
static
HRESULT
WINAPI
InternetExplorer_QueryStatusWB
(
IWebBrowser2
*
iface
,
OLECMDID
cmdID
,
OLECMDF
*
pcmdf
)
...
...
dlls/shdocvw/iexplore.c
View file @
967561f8
...
...
@@ -50,6 +50,8 @@ static const WCHAR szIEWinFrame[] = { 'I','E','F','r','a','m','e',0 };
static
const
WCHAR
wszWineInternetExplorer
[]
=
{
'W'
,
'i'
,
'n'
,
'e'
,
' '
,
'I'
,
'n'
,
't'
,
'e'
,
'r'
,
'n'
,
'e'
,
't'
,
' '
,
'E'
,
'x'
,
'p'
,
'l'
,
'o'
,
'r'
,
'e'
,
'r'
,
0
};
static
LONG
obj_cnt
;
HRESULT
update_ie_statustext
(
InternetExplorer
*
This
,
LPCWSTR
text
)
{
if
(
!
SendMessageW
(
This
->
status_hwnd
,
SB_SETTEXTW
,
MAKEWORD
(
SB_SIMPLEID
,
0
),
(
LPARAM
)
text
))
...
...
@@ -505,8 +507,8 @@ static LRESULT iewnd_OnSize(InternetExplorer *This, INT width, INT height)
adjust_ie_docobj_rect
(
This
->
frame_hwnd
,
&
docarea
);
if
(
This
->
doc_host
.
hwnd
)
SetWindowPos
(
This
->
doc_host
.
hwnd
,
NULL
,
docarea
.
left
,
docarea
.
top
,
docarea
.
right
,
docarea
.
bottom
,
if
(
This
->
doc_host
->
doc_host
.
hwnd
)
SetWindowPos
(
This
->
doc_host
->
doc_host
.
hwnd
,
NULL
,
docarea
.
left
,
docarea
.
top
,
docarea
.
right
,
docarea
.
bottom
,
SWP_NOZORDER
|
SWP_NOACTIVATE
);
SetWindowPos
(
hwndRebar
,
NULL
,
0
,
0
,
width
,
barHeight
,
SWP_NOZORDER
|
SWP_NOACTIVATE
);
...
...
@@ -551,7 +553,6 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This)
free_fav_menu_data
(
get_fav_menu
(
This
->
menu
));
ImageList_Destroy
(
list
);
This
->
frame_hwnd
=
NULL
;
PostQuitMessage
(
0
);
/* FIXME */
return
0
;
}
...
...
@@ -565,11 +566,11 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR
break
;
case
ID_BROWSE_PRINT
:
if
(
This
->
doc_host
.
document
)
if
(
This
->
doc_host
->
doc_host
.
document
)
{
IOleCommandTarget
*
target
;
if
(
FAILED
(
IUnknown_QueryInterface
(
This
->
doc_host
.
document
,
&
IID_IOleCommandTarget
,
(
LPVOID
*
)
&
target
)))
if
(
FAILED
(
IUnknown_QueryInterface
(
This
->
doc_host
->
doc_host
.
document
,
&
IID_IOleCommandTarget
,
(
LPVOID
*
)
&
target
)))
break
;
IOleCommandTarget_Exec
(
target
,
&
CGID_MSHTML
,
IDM_PRINT
,
OLECMDEXECOPT_DODEFAULT
,
NULL
,
NULL
);
...
...
@@ -587,7 +588,7 @@ static LRESULT iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT msg, WPAR
break
;
case
ID_BROWSE_QUIT
:
iewnd_OnDestroy
(
This
);
ShowWindow
(
hwnd
,
SW_HIDE
);
break
;
default:
...
...
@@ -624,6 +625,17 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
case
WM_CREATE
:
return
iewnd_OnCreate
(
hwnd
,
(
LPCREATESTRUCTW
)
lparam
);
case
WM_CLOSE
:
TRACE
(
"WM_CLOSE
\n
"
);
ShowWindow
(
hwnd
,
SW_HIDE
);
return
0
;
case
WM_SHOWWINDOW
:
TRACE
(
"WM_SHOWWINDOW %lx
\n
"
,
wparam
);
if
(
wparam
)
IWebBrowser2_AddRef
(
&
This
->
IWebBrowser2_iface
);
else
IWebBrowser2_Release
(
&
This
->
IWebBrowser2_iface
);
break
;
case
WM_DESTROY
:
return
iewnd_OnDestroy
(
This
);
case
WM_SIZE
:
...
...
@@ -633,7 +645,7 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
case
WM_NOTIFY
:
return
iewnd_OnNotify
(
This
,
wparam
,
lparam
);
case
WM_DOCHOSTTASK
:
return
process_dochost_task
(
&
This
->
doc_host
,
lparam
);
return
process_dochost_task
(
&
This
->
doc_host
->
doc_host
,
lparam
);
case
WM_UPDATEADDRBAR
:
return
update_addrbar
(
This
,
lparam
);
}
...
...
@@ -678,13 +690,13 @@ static void create_frame_hwnd(InternetExplorer *This)
NULL
,
NULL
/* FIXME */
,
shdocvw_hinstance
,
This
);
}
static
IWebBrowser2
*
create_ie_window
(
LPCSTR
cmdline
)
static
BOOL
create_ie_window
(
LPCSTR
cmdline
)
{
IWebBrowser2
*
wb
=
NULL
;
InternetExplorer_Create
(
NULL
,
&
IID_IWebBrowser2
,
(
void
**
)
&
wb
);
if
(
!
wb
)
return
NULL
;
return
FALSE
;
IWebBrowser2_put_Visible
(
wb
,
VARIANT_TRUE
);
IWebBrowser2_put_MenuBar
(
wb
,
VARIANT_TRUE
);
...
...
@@ -718,12 +730,39 @@ static IWebBrowser2 *create_ie_window(LPCSTR cmdline)
SysFreeString
(
V_BSTR
(
&
var_url
));
}
return
wb
;
IWebBrowser2_Release
(
wb
);
return
TRUE
;
}
static
inline
IEDocHost
*
impl_from_DocHost
(
DocHost
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
IEDocHost
,
doc_host
);
}
static
inline
InternetExplorer
*
impl_from_DocHost
(
DocHost
*
iface
)
static
ULONG
IEDocHost_addref
(
DocHost
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
InternetExplorer
,
doc_host
);
IEDocHost
*
This
=
impl_from_DocHost
(
iface
);
LONG
ref
=
InterlockedIncrement
(
&
This
->
ref
);
TRACE
(
"(%p) ref=%d
\n
"
,
This
,
ref
);
return
ref
;
}
static
ULONG
IEDocHost_release
(
DocHost
*
iface
)
{
IEDocHost
*
This
=
impl_from_DocHost
(
iface
);
LONG
ref
=
InterlockedDecrement
(
&
This
->
ref
);
TRACE
(
"(%p) ref=%d
\n
"
,
This
,
ref
);
if
(
!
ref
)
{
if
(
This
->
ie
)
This
->
ie
->
doc_host
=
NULL
;
heap_free
(
This
);
}
return
ref
;
}
static
void
WINAPI
DocHostContainer_GetDocObjRect
(
DocHost
*
This
,
RECT
*
rc
)
...
...
@@ -732,10 +771,10 @@ static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc)
adjust_ie_docobj_rect
(
This
->
frame_hwnd
,
rc
);
}
static
HRESULT
WINAPI
DocHostContainer_SetStatusText
(
DocHost
*
This
,
LPCWSTR
text
)
static
HRESULT
WINAPI
DocHostContainer_SetStatusText
(
DocHost
*
iface
,
LPCWSTR
text
)
{
I
nternetExplorer
*
ie
=
impl_from_DocHost
(
This
);
return
update_ie_statustext
(
ie
,
text
);
I
EDocHost
*
This
=
impl_from_DocHost
(
iface
);
return
update_ie_statustext
(
This
->
ie
,
text
);
}
static
void
WINAPI
DocHostContainer_SetURL
(
DocHost
*
This
,
LPCWSTR
url
)
...
...
@@ -749,6 +788,8 @@ static HRESULT DocHostContainer_exec(DocHost* This, const GUID *cmd_group, DWORD
return
S_OK
;
}
static
const
IDocHostContainerVtbl
DocHostContainerVtbl
=
{
IEDocHost_addref
,
IEDocHost_release
,
DocHostContainer_GetDocObjRect
,
DocHostContainer_SetStatusText
,
DocHostContainer_SetURL
,
...
...
@@ -763,25 +804,40 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv)
TRACE
(
"(%p %s %p)
\n
"
,
pOuter
,
debugstr_guid
(
riid
),
ppv
);
ret
=
heap_alloc_zero
(
sizeof
(
InternetExplorer
));
ret
->
ref
=
0
;
if
(
!
ret
)
return
E_OUTOFMEMORY
;
ret
->
doc_host
.
disp
=
(
IDispatch
*
)
&
ret
->
IWebBrowser2_iface
;
DocHost_Init
(
&
ret
->
doc_host
,
(
IDispatch
*
)
&
ret
->
IWebBrowser2_iface
,
&
DocHostContainerVtbl
);
ret
->
doc_host
=
heap_alloc_zero
(
sizeof
(
IEDocHost
));
if
(
!
ret
->
doc_host
)
{
heap_free
(
ret
);
return
E_OUTOFMEMORY
;
}
ret
->
ref
=
1
;
ret
->
doc_host
->
ie
=
ret
;
DocHost_Init
(
&
ret
->
doc_host
->
doc_host
,
(
IDispatch
*
)
&
ret
->
IWebBrowser2_iface
,
&
DocHostContainerVtbl
);
InternetExplorer_WebBrowser_Init
(
ret
);
HlinkFrame_Init
(
&
ret
->
hlink_frame
,
(
IUnknown
*
)
&
ret
->
IWebBrowser2_iface
,
&
ret
->
doc_host
);
HlinkFrame_Init
(
&
ret
->
hlink_frame
,
(
IUnknown
*
)
&
ret
->
IWebBrowser2_iface
,
&
ret
->
doc_host
->
doc_host
);
create_frame_hwnd
(
ret
);
ret
->
doc_host
.
frame_hwnd
=
ret
->
frame_hwnd
;
ret
->
doc_host
->
doc_host
.
frame_hwnd
=
ret
->
frame_hwnd
;
hres
=
IWebBrowser2_QueryInterface
(
&
ret
->
IWebBrowser2_iface
,
riid
,
ppv
);
if
(
FAILED
(
hres
))
{
heap_free
(
ret
);
IWebBrowser2_Release
(
&
ret
->
IWebBrowser2_iface
);
if
(
FAILED
(
hres
))
return
hres
;
}
return
hres
;
InterlockedIncrement
(
&
obj_cnt
);
return
S_OK
;
}
void
released_obj
(
void
)
{
if
(
!
InterlockedDecrement
(
&
obj_cnt
))
PostQuitMessage
(
0
);
}
/******************************************************************
...
...
@@ -791,7 +847,6 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv)
*/
DWORD
WINAPI
IEWinMain
(
LPSTR
szCommandLine
,
int
nShowWindow
)
{
IWebBrowser2
*
wb
=
NULL
;
MSG
msg
;
HRESULT
hres
;
...
...
@@ -812,8 +867,12 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
ExitProcess
(
1
);
}
if
(
strcasecmp
(
szCommandLine
,
"-embedding"
))
wb
=
create_ie_window
(
szCommandLine
);
if
(
strcasecmp
(
szCommandLine
,
"-embedding"
))
{
if
(
!
create_ie_window
(
szCommandLine
))
{
CoUninitialize
();
ExitProcess
(
1
);
}
}
/* run the message loop for this thread */
while
(
GetMessageW
(
&
msg
,
0
,
0
,
0
))
...
...
@@ -822,9 +881,6 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
DispatchMessageW
(
&
msg
);
}
if
(
wb
)
IWebBrowser2_Release
(
wb
);
register_class_object
(
FALSE
);
CoUninitialize
();
...
...
dlls/shdocvw/shdocvw.h
View file @
967561f8
...
...
@@ -86,6 +86,8 @@ typedef struct _task_header_t {
typedef
struct
_IDocHostContainerVtbl
{
ULONG
(
*
addref
)(
DocHost
*
);
ULONG
(
*
release
)(
DocHost
*
);
void
(
WINAPI
*
GetDocObjRect
)(
DocHost
*
,
RECT
*
);
HRESULT
(
WINAPI
*
SetStatusText
)(
DocHost
*
,
LPCWSTR
);
void
(
WINAPI
*
SetURL
)(
DocHost
*
,
LPCWSTR
);
...
...
@@ -182,6 +184,14 @@ struct WebBrowser {
DocHost
doc_host
;
};
typedef
struct
{
DocHost
doc_host
;
LONG
ref
;
InternetExplorer
*
ie
;
}
IEDocHost
;
struct
InternetExplorer
{
IWebBrowser2
IWebBrowser2_iface
;
HlinkFrame
hlink_frame
;
...
...
@@ -192,7 +202,7 @@ struct InternetExplorer {
HWND
status_hwnd
;
HMENU
menu
;
DocHost
doc_host
;
IEDocHost
*
doc_host
;
};
void
WebBrowser_OleObject_Init
(
WebBrowser
*
);
...
...
@@ -235,6 +245,8 @@ LRESULT process_dochost_task(DocHost*,LPARAM);
HRESULT
InternetExplorer_Create
(
IUnknown
*
,
REFIID
,
void
**
);
void
InternetExplorer_WebBrowser_Init
(
InternetExplorer
*
);
void
released_obj
(
void
);
HRESULT
CUrlHistory_Create
(
IUnknown
*
,
REFIID
,
void
**
);
HRESULT
InternetShortcut_Create
(
IUnknown
*
,
REFIID
,
void
**
);
...
...
dlls/shdocvw/webbrowser.c
View file @
967561f8
...
...
@@ -1110,6 +1110,18 @@ static inline WebBrowser *impl_from_DocHost(DocHost *iface)
return
CONTAINING_RECORD
(
iface
,
WebBrowser
,
doc_host
);
}
static
ULONG
WebBrowser_addref
(
DocHost
*
iface
)
{
WebBrowser
*
This
=
impl_from_DocHost
(
iface
);
return
IWebBrowser2_AddRef
(
&
This
->
IWebBrowser2_iface
);
}
static
ULONG
WebBrowser_release
(
DocHost
*
iface
)
{
WebBrowser
*
This
=
impl_from_DocHost
(
iface
);
return
IWebBrowser2_Release
(
&
This
->
IWebBrowser2_iface
);
}
static
void
WINAPI
DocHostContainer_GetDocObjRect
(
DocHost
*
This
,
RECT
*
rc
)
{
GetClientRect
(
This
->
frame_hwnd
,
rc
);
...
...
@@ -1156,6 +1168,8 @@ static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, D
}
static
const
IDocHostContainerVtbl
DocHostContainerVtbl
=
{
WebBrowser_addref
,
WebBrowser_release
,
DocHostContainer_GetDocObjRect
,
DocHostContainer_SetStatusText
,
DocHostContainer_SetURL
,
...
...
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