mshtml: Added PersistStreamInit_InitNew implementation.

This commit is contained in:
Piotr Caban 2009-12-07 14:51:52 +01:00 committed by Alexandre Julliard
parent a91fb219a9
commit 45e0dd9d1f
4 changed files with 171 additions and 30 deletions

View File

@ -383,6 +383,7 @@ struct HTMLDocumentObj {
BOOL has_key_path;
BOOL container_locked;
BOOL focus;
INT download_state;
USERMODE usermode;
LPWSTR mime;

View File

@ -185,17 +185,19 @@ static void handle_docobj_load(HTMLDocumentObj *doc)
hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
if(SUCCEEDED(hres)) {
if(doc->download_state) {
VARIANT state, progress;
V_VT(&progress) = VT_I4;
V_I4(&progress) = 0;
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
&progress, NULL);
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS,
OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL);
V_VT(&state) = VT_I4;
V_I4(&state) = 0;
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
&state, NULL);
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE,
OLECMDEXECOPT_DONTPROMPTUSER, &state, NULL);
}
IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL);
IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL);
@ -203,6 +205,7 @@ static void handle_docobj_load(HTMLDocumentObj *doc)
IOleCommandTarget_Release(olecmd);
}
doc->download_state = 0;
}
static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event)

View File

@ -40,6 +40,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct {
task_t header;
HTMLDocumentObj *doc;
BOOL set_download;
} download_proc_task_t;
static BOOL use_gecko_script(LPCWSTR url)
{
static const WCHAR fileW[] = {'f','i','l','e',':'};
@ -118,7 +124,8 @@ static void set_progress_proc(task_t *_task)
static void set_downloading_proc(task_t *_task)
{
HTMLDocumentObj *doc = ((docobj_task_t*)_task)->doc;
download_proc_task_t *task = (download_proc_task_t*)_task;
HTMLDocumentObj *doc = task->doc;
IOleCommandTarget *olecmd;
HRESULT hres;
@ -130,6 +137,7 @@ static void set_downloading_proc(task_t *_task)
if(!doc->client)
return;
if(task->set_download) {
hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
if(SUCCEEDED(hres)) {
VARIANT var;
@ -137,11 +145,14 @@ static void set_downloading_proc(task_t *_task)
V_VT(&var) = VT_I4;
V_I4(&var) = 1;
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
&var, NULL);
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE,
OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
IOleCommandTarget_Release(olecmd);
}
doc->download_state = 1;
}
if(doc->hostui) {
IDropTarget *drop_target = NULL;
@ -153,11 +164,12 @@ static void set_downloading_proc(task_t *_task)
}
}
static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc)
static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL set_download)
{
nsChannelBSC *bscallback;
LPOLESTR url = NULL;
docobj_task_t *task;
download_proc_task_t *download_task;
HRESULT hres;
nsresult nsres;
@ -248,9 +260,10 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc)
push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic);
}
task = heap_alloc(sizeof(docobj_task_t));
task->doc = This->doc_obj;
push_task(&task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
download_task = heap_alloc(sizeof(download_proc_task_t));
download_task->doc = This->doc_obj;
download_task->set_download = set_download;
push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
if(This->doc_obj->nscontainer) {
This->doc_obj->nscontainer->bscallback = bscallback;
@ -363,7 +376,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
hres = set_moniker(This, pimkName, pibc);
hres = set_moniker(This, pimkName, pibc, TRUE);
if(FAILED(hres))
return hres;
@ -624,7 +637,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM
return hres;
}
hres = set_moniker(This, mon, NULL);
hres = set_moniker(This, mon, NULL, TRUE);
IMoniker_Release(mon);
if(FAILED(hres))
return hres;
@ -669,8 +682,45 @@ static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
{
HTMLDocument *This = PERSTRINIT_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
IMoniker *mon;
HGLOBAL body;
LPSTREAM stream;
HRESULT hres;
static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
static const WCHAR html_bodyW[] = {'<','H','T','M','L','>','<','/','H','T','M','L','>',0};
TRACE("(%p)\n", This);
body = GlobalAlloc(0, sizeof(html_bodyW));
if(!body)
return E_OUTOFMEMORY;
memcpy(body, html_bodyW, sizeof(html_bodyW));
hres = CreateURLMoniker(NULL, about_blankW, &mon);
if(FAILED(hres)) {
WARN("CreateURLMoniker failed: %08x\n", hres);
GlobalFree(body);
return hres;
}
hres = set_moniker(This, mon, NULL, FALSE);
IMoniker_Release(mon);
if(FAILED(hres)) {
GlobalFree(body);
return hres;
}
hres = CreateStreamOnHGlobal(body, TRUE, &stream);
if(FAILED(hres)) {
GlobalFree(body);
return hres;
}
hres = channelbsc_load_stream(This->window->bscallback, stream);
IStream_Release(stream);
return hres;
}
#undef PERSTRINIT_THIS

View File

@ -2255,6 +2255,8 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn);
readystate_set_loading = FALSE;
readystate_set_interactive = FALSE;
load_state = LD_COMPLETE;
return S_OK;
case OLECMDID_SETDOWNLOADSTATE:
@ -2889,6 +2891,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
#define DWL_CSS 0x0002
#define DWL_TRYCSS 0x0004
#define DWL_HTTP 0x0008
#define DWL_EMPTY 0x0010
static void test_download(DWORD flags)
{
@ -2905,6 +2908,7 @@ static void test_download(DWORD flags)
if((flags & DWL_VERBDONE) && !load_from_stream)
SET_EXPECT(GetHostInfo);
SET_EXPECT(SetStatusText);
if(!(flags & DWL_EMPTY))
SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
SET_EXPECT(GetDropTarget);
if(flags & DWL_TRYCSS)
@ -2930,6 +2934,7 @@ static void test_download(DWORD flags)
SET_EXPECT(OnChanged_1005);
SET_EXPECT(OnChanged_READYSTATE);
SET_EXPECT(Exec_SETPROGRESSPOS);
if(!(flags & DWL_EMPTY))
SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
SET_EXPECT(Exec_ShellDocView_103);
SET_EXPECT(Exec_ShellDocView_105);
@ -2951,6 +2956,7 @@ static void test_download(DWORD flags)
if((flags & DWL_VERBDONE) && !load_from_stream)
CHECK_CALLED(GetHostInfo);
CHECK_CALLED(SetStatusText);
if(!(flags & DWL_EMPTY))
CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
CHECK_CALLED(GetDropTarget);
if(flags & DWL_TRYCSS)
@ -2976,6 +2982,7 @@ static void test_download(DWORD flags)
CHECK_CALLED(OnChanged_1005);
CHECK_CALLED(OnChanged_READYSTATE);
CHECK_CALLED(Exec_SETPROGRESSPOS);
if(!(flags & DWL_EMPTY))
CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
SET_CALLED(Exec_ShellDocView_103);
SET_CALLED(Exec_ShellDocView_105);
@ -3940,6 +3947,36 @@ static void test_StreamLoad(IUnknown *unk)
IPersistStreamInit_Release(init);
}
static void test_StreamInitNew(IUnknown *unk)
{
IPersistStreamInit *init;
HRESULT hres;
hres = IUnknown_QueryInterface(unk, &IID_IPersistStreamInit, (void**)&init);
ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit) failed: %08x\n", hres);
if(FAILED(hres))
return;
SET_EXPECT(Invoke_AMBIENT_SILENT);
SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
SET_EXPECT(Exec_ShellDocView_37);
SET_EXPECT(OnChanged_READYSTATE);
readystate_set_loading = TRUE;
hres = IPersistStreamInit_InitNew(init);
ok(hres == S_OK, "Load failed: %08x\n", hres);
CHECK_CALLED(Invoke_AMBIENT_SILENT);
CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
CHECK_CALLED(Exec_ShellDocView_37);
CHECK_CALLED(OnChanged_READYSTATE);
test_timer(EXPECT_SETTITLE);
test_GetCurMoniker(unk, NULL, about_blank_url);
IPersistStreamInit_Release(init);
}
static void test_QueryInterface(IUnknown *unk)
{
IUnknown *qi;
@ -4298,6 +4335,55 @@ static void test_HTMLDocument_StreamLoad(void)
ok(ref == 0, "ref=%d, expected 0\n", ref);
}
static void test_HTMLDocument_StreamInitNew(void)
{
IOleObject *oleobj;
IUnknown *unk;
HRESULT hres;
ULONG ref;
trace("Testing HTMLDocument (IPersistStreamInit)...\n");
init_test(LD_DOLOAD);
load_from_stream = TRUE;
hres = create_document(&unk);
if(FAILED(hres))
return;
doc_unk = unk;
hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
test_readyState(unk);
test_IsDirty(unk, S_FALSE);
test_ConnectionPointContainer(unk);
test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
test_DoVerb(oleobj);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
IOleObject_Release(oleobj);
test_GetCurMoniker(unk, NULL, NULL);
test_StreamInitNew(unk);
test_download(DWL_VERBDONE|DWL_TRYCSS|DWL_EMPTY);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
test_UIDeactivate();
test_InPlaceDeactivate(unk, TRUE);
test_Close(unk, FALSE);
test_IsDirty(unk, S_FALSE);
if(view) {
IOleDocumentView_Release(view);
view = NULL;
}
ref = IUnknown_Release(unk);
ok(ref == 0, "ref=%d, expected 0\n", ref);
}
static void test_edit_uiactivate(IOleObject *oleobj)
{
IOleDocumentView *docview;
@ -4479,6 +4565,7 @@ START_TEST(htmldoc)
test_HTMLDocument(FALSE);
test_HTMLDocument(TRUE);
test_HTMLDocument_StreamLoad();
test_HTMLDocument_StreamInitNew();
test_editing_mode(FALSE);
test_editing_mode(TRUE);
test_HTMLDocument_http();