winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
November 2022
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
1171 discussions
Start a n
N
ew thread
Piotr Caban : localspl: Introduce printer_info_t structure.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: 90fa4b428d28cd8ed526c703cd9d8f8983d387c5 URL:
https://gitlab.winehq.org/wine/wine/-/commit/90fa4b428d28cd8ed526c703cd9d8f…
Author: Piotr Caban <piotr(a)codeweavers.com> Date: Thu Nov 17 21:01:03 2022 +0100 localspl: Introduce printer_info_t structure. The structure will be used to store printer information shared between all printer handles (like printer name, attributes, job queue). --- dlls/localspl/provider.c | 101 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c index 2b29426b0e1..25a67e3ae36 100644 --- a/dlls/localspl/provider.c +++ b/dlls/localspl/provider.c @@ -176,6 +176,15 @@ static CRITICAL_SECTION_DEBUG monitor_handles_cs_debug = }; static CRITICAL_SECTION monitor_handles_cs = { &monitor_handles_cs_debug, -1, 0, 0, 0, 0 }; +static CRITICAL_SECTION printers_cs; +static CRITICAL_SECTION_DEBUG printers_cs_debug = +{ + 0, 0, &printers_cs, + { &printers_cs_debug.ProcessLocksList, &printers_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": printers_cs") } +}; +static CRITICAL_SECTION printers_cs = { &printers_cs_debug, -1, 0, 0, 0, 0 }; + /* ############################### */ typedef struct { @@ -208,8 +217,14 @@ typedef struct { } printenv_t; typedef struct { + WCHAR *name; + struct list entry; + LONG ref; +} printer_info_t; + +typedef struct { + printer_info_t *info; LPWSTR name; - LPWSTR printername; monitor_t * pm; HANDLE hXcv; } printer_t; @@ -219,6 +234,8 @@ typedef struct { static struct list monitor_handles = LIST_INIT( monitor_handles ); static monitor_t * pm_localport; +static struct list printers = LIST_INIT(printers); + static const WCHAR fmt_driversW[] = L"System\\CurrentControlSet\\control\\Print\\Environments\\%s\\Drivers%s"; static const WCHAR fmt_printprocessorsW[] = @@ -436,6 +453,65 @@ static void monitor_unloadall(void) LeaveCriticalSection(&monitor_handles_cs); } +static printer_info_t* get_printer_info(const WCHAR *name) +{ + HKEY hkey, hprinter = NULL; + printer_info_t *info; + LSTATUS ret; + + EnterCriticalSection(&printers_cs); + LIST_FOR_EACH_ENTRY(info, &printers, printer_info_t, entry) + { + if (!wcscmp(info->name, name)) + { + InterlockedIncrement(&info->ref); + LeaveCriticalSection(&printers_cs); + return info; + } + } + + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, printersW, &hkey); + if (ret == ERROR_SUCCESS) + ret = RegOpenKeyW(hkey, name, &hprinter); + RegCloseKey(hkey); + RegCloseKey(hprinter); + if (ret != ERROR_SUCCESS) + { + LeaveCriticalSection(&printers_cs); + return NULL; + } + + if ((info = calloc(1, sizeof(*info))) && (info->name = wcsdup(name))) + { + info->ref = 1; + list_add_head(&printers, &info->entry); + } + else if (info) + { + free(info); + info = NULL; + } + LeaveCriticalSection(&printers_cs); + + return info; +} + +static void release_printer_info(printer_info_t *info) +{ + if (!info) + return; + + if (!InterlockedDecrement(&info->ref)) + { + EnterCriticalSection(&printers_cs); + list_remove(&info->entry); + LeaveCriticalSection(&printers_cs); + + free(info->name); + free(info); + } +} + static LONG WINAPI CreateKey(HANDLE hcKey, LPCWSTR pszSubKey, DWORD dwOptions, REGSAM samDesired, PSECURITY_ATTRIBUTES pSecurityAttributes, PHANDLE phckResult, PDWORD pdwDisposition, HANDLE hSpooler) @@ -1397,7 +1473,7 @@ static VOID printer_free(printer_t * printer) monitor_unload(printer->pm); - free(printer->printername); + release_printer_info(printer->info); free(printer->name); free(printer); } @@ -1412,8 +1488,6 @@ static HANDLE printer_alloc_handle(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault) WCHAR servername[MAX_COMPUTERNAME_LENGTH + 1]; printer_t *printer = NULL; LPCWSTR printername; - HKEY hkeyPrinters; - HKEY hkeyPrinter; DWORD len; if (copy_servername_from_name(name, servername)) { @@ -1434,9 +1508,6 @@ static HANDLE printer_alloc_handle(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault) printer = calloc(1, sizeof(printer_t)); if (!printer) goto end; - /* clone the base name. This is NULL for the printserver */ - printer->printername = wcsdup(printername); - /* clone the full name */ printer->name = wcsdup(name); if (name && (!printer->name)) { @@ -1486,24 +1557,14 @@ static HANDLE printer_alloc_handle(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault) } else { - /* Does the Printer exist? */ - if (RegCreateKeyW(HKEY_LOCAL_MACHINE, printersW, &hkeyPrinters) != ERROR_SUCCESS) { - ERR("Can't create Printers key\n"); - printer_free(printer); - SetLastError(ERROR_INVALID_PRINTER_NAME); - printer = NULL; - goto end; - } - if (RegOpenKeyW(hkeyPrinters, printername, &hkeyPrinter) != ERROR_SUCCESS) { - WARN("Printer not found in Registry: %s\n", debugstr_w(printername)); - RegCloseKey(hkeyPrinters); + printer->info = get_printer_info(printername); + if (!printer->info) + { printer_free(printer); SetLastError(ERROR_INVALID_PRINTER_NAME); printer = NULL; goto end; } - RegCloseKey(hkeyPrinter); - RegCloseKey(hkeyPrinters); } } else
1
0
0
0
Piotr Caban : localspl: Convert MONITOREX structure to MONITOR2 during port monitor initialization.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: f89a5fd4581836dda6a322b41b159bfee5fb0204 URL:
https://gitlab.winehq.org/wine/wine/-/commit/f89a5fd4581836dda6a322b41b159b…
Author: Piotr Caban <piotr(a)codeweavers.com> Date: Sat Nov 26 23:08:41 2022 +0100 localspl: Convert MONITOREX structure to MONITOR2 during port monitor initialization. --- dlls/localspl/provider.c | 198 ++++++++++++++++++++--------------------------- 1 file changed, 86 insertions(+), 112 deletions(-)
1
0
0
0
Alex Henrie : mshtml: Remove string constant macros from navigate.c.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: b1391caf64da2b4f458cdabe3479a2f9fdf43653 URL:
https://gitlab.winehq.org/wine/wine/-/commit/b1391caf64da2b4f458cdabe3479a2…
Author: Alex Henrie <alexhenrie24(a)gmail.com> Date: Sun Nov 27 15:05:07 2022 -0700 mshtml: Remove string constant macros from navigate.c. Having an extra layer of indirection here makes the code less clear. --- dlls/mshtml/navigate.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index fa6a09c31e3..fd92483cbf5 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -41,10 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); -#define CONTENT_LENGTH "Content-Length" -#define UTF8_STR "utf-8" -#define UTF16_STR "utf-16" - struct nsProtocolStream { nsIInputStream nsIInputStream_iface; @@ -1152,10 +1148,10 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream) if(first_read) { switch(This->bsc.bom) { case BOM_UTF8: - This->nschannel->charset = strdup(UTF8_STR); + This->nschannel->charset = strdup("utf-8"); break; case BOM_UTF16: - This->nschannel->charset = strdup(UTF16_STR); + This->nschannel->charset = strdup("utf-16"); case BOM_NONE: /* FIXME: Get charset from HTTP headers */; }
1
0
0
0
Gabriel Ivăncescu : include/mshtml: Add IHTMLXDomainRequest and factory interfaces and classes.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: 60279d0d5a859ab25e5e9ebb03e25e9674698fa4 URL:
https://gitlab.winehq.org/wine/wine/-/commit/60279d0d5a859ab25e5e9ebb03e25e…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:04 2022 +0200 include/mshtml: Add IHTMLXDomainRequest and factory interfaces and classes. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- include/mshtmdid.h | 16 ++++++++ include/mshtml.idl | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/include/mshtmdid.h b/include/mshtmdid.h index 6260083aaf4..0e95a7d7165 100644 --- a/include/mshtmdid.h +++ b/include/mshtmdid.h @@ -105,6 +105,7 @@ #define DISPID_NAMESPACE DISPID_NORMAL_FIRST #define DISPID_TAGNAMES_COLLECTION DISPID_NORMAL_FIRST #define DISPID_XMLHTTPREQUEST DISPID_NORMAL_FIRST +#define DISPID_XDOMAINREQUEST DISPID_NORMAL_FIRST #define DISPID_DOMPARSER DISPID_NORMAL_FIRST #define DISPID_DOCUMENTCOMPATIBLEINFO_COLLECTION DISPID_NORMAL_FIRST #define DISPID_DOCUMENTCOMPATIBLEINFO DISPID_NORMAL_FIRST @@ -3085,6 +3086,18 @@ #define DISPID_IHTMLXMLHTTPREQUEST2_TIMEOUT DISPID_XMLHTTPREQUEST+15 #define DISPID_IHTMLXMLHTTPREQUEST2_ONTIMEOUT DISPID_EVPROP_TIMEOUT +/* IHTMLXDomainRequest */ +#define DISPID_IHTMLXDOMAINREQUEST_RESPONSETEXT DISPID_XDOMAINREQUEST+3 +#define DISPID_IHTMLXDOMAINREQUEST_TIMEOUT DISPID_XDOMAINREQUEST+4 +#define DISPID_IHTMLXDOMAINREQUEST_CONTENTTYPE DISPID_XDOMAINREQUEST+5 +#define DISPID_IHTMLXDOMAINREQUEST_ONPROGRESS DISPID_XDOMAINREQUEST+6 +#define DISPID_IHTMLXDOMAINREQUEST_ONERROR DISPID_EVPROP_ONERROR +#define DISPID_IHTMLXDOMAINREQUEST_ONTIMEOUT DISPID_EVPROP_TIMEOUT +#define DISPID_IHTMLXDOMAINREQUEST_ONLOAD DISPID_EVPROP_ONLOAD +#define DISPID_IHTMLXDOMAINREQUEST_ABORT DISPID_XDOMAINREQUEST+10 +#define DISPID_IHTMLXDOMAINREQUEST_OPEN DISPID_XDOMAINREQUEST+11 +#define DISPID_IHTMLXDOMAINREQUEST_SEND DISPID_XDOMAINREQUEST+12 + /* ISVGAnimatedEnumeration */ #define DISPID_ISVGANIMATEDENUMERATION_BASEVAL DISPID_SVGANIMATEDENUMERATION #define DISPID_ISVGANIMATEDENUMERATION_ANIMVAL DISPID_SVGANIMATEDENUMERATION+1 @@ -3344,6 +3357,9 @@ #define DISPID_HTMLXMLHTTPREQUESTEVENTS_ONTIMEOUT DISPID_XMLHTTPREQUEST+16 #define DISPID_HTMLXMLHTTPREQUESTEVENTS_ONREADYSTATECHANGE DISPID_XMLHTTPREQUEST+8 +/* IHTMLXDomainRequestFactory */ +#define DISPID_IHTMLXDOMAINREQUESTFACTORY_CREATE DISPID_VALUE + /* IOmHistory */ #define DISPID_IOMHISTORY_LENGTH DISPID_HISTORY #define DISPID_IOMHISTORY_BACK (DISPID_HISTORY+1) diff --git a/include/mshtml.idl b/include/mshtml.idl index 8c5fa25f75b..eff87a4593e 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -14092,6 +14092,117 @@ coclass HTMLXMLHttpRequest interface IEventTarget; } +/***************************************************************************** + * IHTMLXDomainRequest interface + */ +[ + odl, + oleautomation, + dual, + uuid(30510454-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLXDomainRequest : IDispatch +{ + [propget, id(DISPID_IHTMLXDOMAINREQUEST_RESPONSETEXT)] + HRESULT responseText([out, retval] BSTR *p); + + [propput, id(DISPID_IHTMLXDOMAINREQUEST_TIMEOUT)] + HRESULT timeout([in] LONG v); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_TIMEOUT)] + HRESULT timeout([out, retval] LONG *p); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_CONTENTTYPE)] + HRESULT contentType([out, retval] BSTR *p); + + [propput, id(DISPID_IHTMLXDOMAINREQUEST_ONPROGRESS)] + HRESULT onprogress([in] VARIANT v); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_ONPROGRESS)] + HRESULT onprogress([out, retval] VARIANT *p); + + [propput, id(DISPID_IHTMLXDOMAINREQUEST_ONERROR)] + HRESULT onerror([in] VARIANT v); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_ONERROR)] + HRESULT onerror([out, retval] VARIANT *p); + + [propput, id(DISPID_IHTMLXDOMAINREQUEST_ONTIMEOUT)] + HRESULT ontimeout([in] VARIANT v); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_ONTIMEOUT)] + HRESULT ontimeout([out, retval] VARIANT *p); + + [propput, id(DISPID_IHTMLXDOMAINREQUEST_ONLOAD)] + HRESULT onload([in] VARIANT v); + + [propget, id(DISPID_IHTMLXDOMAINREQUEST_ONLOAD)] + HRESULT onload([out, retval] VARIANT *p); + + [id(DISPID_IHTMLXDOMAINREQUEST_ABORT)] + HRESULT abort(); + + [id(DISPID_IHTMLXDOMAINREQUEST_OPEN)] + HRESULT open([in] BSTR bstrMethod, [in] BSTR bstrUrl); + + [id(DISPID_IHTMLXDOMAINREQUEST_SEND)] + HRESULT send([in, optional] VARIANT varBody); +}; + +/***************************************************************************** + * IHTMLXDomainRequestFactory interface + */ +[ + odl, + oleautomation, + dual, + uuid(30510456-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLXDomainRequestFactory : IDispatch +{ + [id(DISPID_IHTMLXDOMAINREQUESTFACTORY_CREATE)] + HRESULT create([out, retval] IHTMLXDomainRequest **p); +}; + +/***************************************************************************** + * DispXDomainRequest dispinterface + */ +[ + hidden, + uuid(3050f599-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispXDomainRequest +{ +properties: +methods: + WINE_IHTMLDOMCONSTRUCTOR_DISPINTERFACE_DECL; +}; + +/***************************************************************************** + * XDomainRequest + */ +[ + noncreatable, + uuid(30510455-98b5-11cf-bb82-00aa00bdce0b) +] +coclass XDomainRequest +{ + [default] dispinterface DispXDomainRequest; + interface IHTMLDOMConstructor; +}; + +/***************************************************************************** + * XDomainRequestFactory + */ +[ + noncreatable, + uuid(30510457-98b5-11cf-bb82-00aa00bdce0b) +] +coclass XDomainRequestFactory +{ + [default] interface IHTMLXDomainRequestFactory; +}; + /***************************************************************************** * IHTMLControlElement interface */
1
0
0
0
Gabriel Ivăncescu : mshtml: Don't check for doc_node from the doc obj when it can't be NULL.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: 9a0d0e861609798fdde3cb67b8f4edda4288d879 URL:
https://gitlab.winehq.org/wine/wine/-/commit/9a0d0e861609798fdde3cb67b8f4ed…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:04 2022 +0200 mshtml: Don't check for doc_node from the doc obj when it can't be NULL. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/olecmd.c | 4 ---- dlls/mshtml/oleobj.c | 16 ++++++++-------- dlls/mshtml/persist.c | 8 -------- dlls/mshtml/view.c | 2 +- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c index ac5a22ef16a..5767751ac14 100644 --- a/dlls/mshtml/olecmd.c +++ b/dlls/mshtml/olecmd.c @@ -991,8 +991,6 @@ static HRESULT WINAPI DocObjOleCommandTarget_QueryStatus(IOleCommandTarget *ifac { HTMLDocumentObj *This = HTMLDocumentObj_from_IOleCommandTarget(iface); - if(!This->doc_node) - return E_UNEXPECTED; return IOleCommandTarget_QueryStatus(&This->doc_node->IOleCommandTarget_iface, pguidCmdGroup, cCmds, prgCmds, pCmdText); } @@ -1002,8 +1000,6 @@ static HRESULT WINAPI DocObjOleCommandTarget_Exec(IOleCommandTarget *iface, cons { HTMLDocumentObj *This = HTMLDocumentObj_from_IOleCommandTarget(iface); - if(!This->doc_node) - return E_UNEXPECTED; return IOleCommandTarget_Exec(&This->doc_node->IOleCommandTarget_iface, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); } diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c index cc2d6aaf5e5..e6f5239538c 100644 --- a/dlls/mshtml/oleobj.c +++ b/dlls/mshtml/oleobj.c @@ -2169,37 +2169,37 @@ static HRESULT WINAPI DocObj##iface##_Invoke(I##iface *_0, DISPID dispIdMember, #define HTMLDOCUMENTOBJ_FWD_TO_NODE_0(iface, method) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface); \ } #define HTMLDOCUMENTOBJ_FWD_TO_NODE_1(iface, method, a) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0, a _1) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1); \ } #define HTMLDOCUMENTOBJ_FWD_TO_NODE_2(iface, method, a,b) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0, a _1, b _2) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2); \ } #define HTMLDOCUMENTOBJ_FWD_TO_NODE_3(iface, method, a,b,c) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0, a _1, b _2, c _3) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3); \ } #define HTMLDOCUMENTOBJ_FWD_TO_NODE_4(iface, method, a,b,c,d) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0, a _1, b _2, c _3, d _4) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3, _4) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3, _4); \ } #define HTMLDOCUMENTOBJ_FWD_TO_NODE_5(iface, method, a,b,c,d,e) static HRESULT WINAPI DocObj##iface##_##method(I##iface *_0, a _1, b _2, c _3, d _4, e _5) \ { \ HTMLDocumentObj *This = CONTAINING_RECORD(_0, HTMLDocumentObj, I##iface##_iface); \ - return This->doc_node ? This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3, _4, _5) : E_UNEXPECTED; \ + return This->doc_node->I##iface##_iface.lpVtbl->method(&This->doc_node->I##iface##_iface, _1, _2, _3, _4, _5); \ } /********************************************************** @@ -3618,7 +3618,7 @@ static void HTMLDocumentObj_on_advise(IUnknown *iface, cp_static_data_t *cp) { HTMLDocumentObj *This = impl_from_IUnknown(iface); - if(This->window && This->doc_node) + if(This->window) update_doc_cp_events(This->doc_node, cp); } @@ -3704,7 +3704,7 @@ static HRESULT create_document_object(BOOL is_mhtml, IUnknown *outer, REFIID rii doc->window = doc->nscontainer->content_window; IHTMLWindow2_AddRef(&doc->window->base.IHTMLWindow2_iface); - if(!doc->doc_node && doc->window->base.inner_window->doc) { + if(!doc->doc_node) { doc->doc_node = doc->window->base.inner_window->doc; IHTMLDOMNode_AddRef(&doc->doc_node->node.IHTMLDOMNode_iface); } diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index ff5f7ecf0e2..581a25c4e2e 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -1008,10 +1008,6 @@ static HRESULT WINAPI DocObjPersistFile_Save(IPersistFile *iface, LPCOLESTR pszF { HTMLDocumentObj *This = HTMLDocumentObj_from_IPersistFile(iface); - if(!This->doc_node) { - FIXME("No doc_node\n"); - return E_UNEXPECTED; - } return IPersistFile_Save(&This->doc_node->IPersistFile_iface, pszFileName, fRemember); } @@ -1202,10 +1198,6 @@ static HRESULT WINAPI DocObjPersistStreamInit_Save(IPersistStreamInit *iface, IS { HTMLDocumentObj *This = HTMLDocumentObj_from_IPersistStreamInit(iface); - if(!This->doc_node) { - FIXME("No doc_node\n"); - return E_UNEXPECTED; - } return IPersistStreamInit_Save(&This->doc_node->IPersistStreamInit_iface, pStm, fClearDirty); } diff --git a/dlls/mshtml/view.c b/dlls/mshtml/view.c index deaf7d38be9..6b7ecb0bc27 100644 --- a/dlls/mshtml/view.c +++ b/dlls/mshtml/view.c @@ -446,7 +446,7 @@ static void send_unload_events_impl(HTMLInnerWindow *window) static void send_unload_events(HTMLDocumentObj *doc) { - if(!doc->doc_node || !doc->window || !doc->doc_node->content_ready) + if(!doc->window || !doc->doc_node->content_ready) return; send_unload_events_impl(doc->window->base.inner_window);
1
0
0
0
Gabriel Ivăncescu : mshtml: Return proper error for invalid selectors in IE8 mode.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: b99c89f38369a9894430d32209fcf60c5f65b8cf URL:
https://gitlab.winehq.org/wine/wine/-/commit/b99c89f38369a9894430d32209fcf6…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:04 2022 +0200 mshtml: Return proper error for invalid selectors in IE8 mode. More importantly it gets rid of the ERR since such failures are normal. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/htmldoc.c | 13 +++++---- dlls/mshtml/htmlelem.c | 13 +++++---- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/nsembed.c | 2 ++ dlls/mshtml/tests/documentmode.js | 58 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 12 deletions(-) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index d4d32693f80..a80dfe4f671 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -4742,8 +4742,8 @@ static HRESULT WINAPI DocumentSelector_querySelector(IDocumentSelector *iface, B nsres = nsIDOMDocument_QuerySelector(This->dom_document, &nsstr, &nselem); nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) { - ERR("QuerySelector failed: %08lx\n", nsres); - return E_FAIL; + WARN("QuerySelector failed: %08lx\n", nsres); + return map_nsresult(nsres); } if(!nselem) { @@ -4765,16 +4765,17 @@ static HRESULT WINAPI DocumentSelector_querySelectorAll(IDocumentSelector *iface HTMLDocumentNode *This = impl_from_IDocumentSelector(iface); nsIDOMNodeList *node_list; nsAString nsstr; + nsresult nsres; HRESULT hres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel); nsAString_InitDepend(&nsstr, v); - hres = map_nsresult(nsIDOMDocument_QuerySelectorAll(This->dom_document, &nsstr, &node_list)); + nsres = nsIDOMDocument_QuerySelectorAll(This->dom_document, &nsstr, &node_list); nsAString_Finish(&nsstr); - if(FAILED(hres)) { - ERR("QuerySelectorAll failed: %08lx\n", hres); - return hres; + if(NS_FAILED(nsres)) { + WARN("QuerySelectorAll failed: %08lx\n", nsres); + return map_nsresult(nsres); } hres = create_child_collection(node_list, dispex_compat_mode(&This->node.event_target.dispex), pel); diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 24040d914ec..07fe6141e6b 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6344,8 +6344,8 @@ static HRESULT WINAPI ElementSelector_querySelector(IElementSelector *iface, BST nsres = nsIDOMElement_QuerySelector(This->dom_element, &nsstr, &nselem); nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) { - ERR("QuerySelector failed: %08lx\n", nsres); - return E_FAIL; + WARN("QuerySelector failed: %08lx\n", nsres); + return map_nsresult(nsres); } if(!nselem) { @@ -6367,6 +6367,7 @@ static HRESULT WINAPI ElementSelector_querySelectorAll(IElementSelector *iface, HTMLElement *This = impl_from_IElementSelector(iface); nsIDOMNodeList *node_list; nsAString nsstr; + nsresult nsres; HRESULT hres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel); @@ -6377,11 +6378,11 @@ static HRESULT WINAPI ElementSelector_querySelectorAll(IElementSelector *iface, } nsAString_InitDepend(&nsstr, v); - hres = map_nsresult(nsIDOMElement_QuerySelectorAll(This->dom_element, &nsstr, &node_list)); + nsres = nsIDOMElement_QuerySelectorAll(This->dom_element, &nsstr, &node_list); nsAString_Finish(&nsstr); - if(FAILED(hres)) { - ERR("QuerySelectorAll failed: %08lx\n", hres); - return hres; + if(NS_FAILED(nsres)) { + WARN("QuerySelectorAll failed: %08lx\n", nsres); + return map_nsresult(nsres); } hres = create_child_collection(node_list, dispex_compat_mode(&This->node.event_target.dispex), pel); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index af1c50c5091..b750cad6585 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -59,6 +59,7 @@ #define NS_ERROR_INVALID_ARG ((nsresult)0x80070057L) #define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL) #define NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR ((nsresult)0x80530007) +#define NS_ERROR_DOM_SYNTAX_ERR ((nsresult)0x8053000c) #define NS_ERROR_MODULE_NETWORK 6 diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 8fb3b2a52ed..b7518f55ef9 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -911,6 +911,8 @@ HRESULT map_nsresult(nsresult nsres) return E_UNEXPECTED; case NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR: return 0x80700007; /* according to tests */ + case NS_ERROR_DOM_SYNTAX_ERR: + return E_INVALIDARG; /* FIXME: Throw SyntaxError for IE9+ modes */ case NS_BINDING_ABORTED: return E_ABORT; } diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 8fd97d11cd6..760d8db5e38 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -2200,6 +2200,64 @@ sync_test("nullDisp", function() { } }); +sync_test("invalid selectors", function() { + var v = document.documentMode, body = document.body, i; + if(v < 8) + return; + + var selectors = [ + "[s!='']", + "*,:x", + "*,##", + ":x", + "##", + "*,", + "," + ]; + + for(i = 0; i < selectors.length; i++) { + try { + body.querySelector(selectors[i]); + ok(false, "body.querySelector(\"" + selectors[i] + "\" did not throw exception"); + }catch(e) { + if(v < 9) + ok(e.number === 0x70057 - 0x80000000, "body.querySelector(\"" + selectors[i] + "\" threw " + e.number); + else { + todo_wine. + ok(e.name === (v < 10 ? undefined : "SyntaxError"), "body.querySelector(\"" + selectors[i] + "\" threw " + e.name); + } + } + try { + body.querySelectorAll(selectors[i]); + ok(false, "body.querySelectorAll(\"" + selectors[i] + "\" did not throw exception"); + }catch(e) { + if(v < 9) + ok(e.number === 0x70057 - 0x80000000, "body.querySelectorAll(\"" + selectors[i] + "\" threw " + e.number); + else { + todo_wine. + ok(e.name === (v < 10 ? undefined : "SyntaxError"), "body.querySelectorAll(\"" + selectors[i] + "\" threw " + e.name); + } + } + } + + if(!body.msMatchesSelector) + return; + + for(i = 0; i < selectors.length; i++) { + try { + body.msMatchesSelector(selectors[i]); + ok(false, "body.msMatchesSelector(\"" + selectors[i] + "\" did not throw exception"); + }catch(e) { + if(v < 9) + ok(e.number === 0x70057 - 0x80000000, "body.msMatchesSelector(\"" + selectors[i] + "\" threw " + e.number); + else { + todo_wine. + ok(e.name === (v < 10 ? undefined : "SyntaxError"), "body.msMatchesSelector(\"" + selectors[i] + "\" threw " + e.name); + } + } + } +}); + sync_test("__proto__", function() { var v = document.documentMode; var r, x = 42;
1
0
0
0
Gabriel Ivăncescu : mshtml: Treat edit mode as a reload.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: be8bd0e6b0ea3644193c0443fb4c23ba1e99379c URL:
https://gitlab.winehq.org/wine/wine/-/commit/be8bd0e6b0ea3644193c0443fb4c23…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:03 2022 +0200 mshtml: Treat edit mode as a reload. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/mutation.c | 2 +- dlls/mshtml/nsevents.c | 3 +-- dlls/mshtml/persist.c | 3 +++ dlls/mshtml/tests/htmldoc.c | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index d7167ebe2da..e308c1af31b 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -283,7 +283,7 @@ static void parse_complete(HTMLDocumentObj *doc) call_property_onchanged(&doc->cp_container, 1005); call_explorer_69(doc); - if(doc->webbrowser && doc->nscontainer->usermode != EDITMODE && !(doc->window->load_flags & BINDING_REFRESH)) + if(doc->webbrowser && !(doc->window->load_flags & BINDING_REFRESH)) IDocObjectService_FireNavigateComplete2(doc->doc_object_service, &doc->window->base.IHTMLWindow2_iface, 0); /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */ diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 3bc5dc5baa2..875d2b5bcf6 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -358,8 +358,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event update_title(doc_obj); } - if(doc_obj && doc_obj->nscontainer->usermode != EDITMODE && doc_obj->doc_object_service - && !(doc->outer_window->load_flags & BINDING_REFRESH)) + if(doc_obj && doc_obj->doc_object_service && !(doc->outer_window->load_flags & BINDING_REFRESH)) IDocObjectService_FireDocumentComplete(doc_obj->doc_object_service, &doc->outer_window->base.IHTMLWindow2_iface, 0); diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index d586c25e18a..ff5f7ecf0e2 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -413,6 +413,9 @@ HRESULT set_moniker(HTMLOuterWindow *window, IMoniker *mon, IUri *nav_uri, IBind } } + if(doc_obj->nscontainer->usermode == EDITMODE) + window->load_flags = BINDING_REFRESH; + download_task = malloc(sizeof(download_proc_task_t)); download_task->doc = doc_obj; download_task->set_download = set_download; diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index b4971e5784d..bbfac5aa8fa 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -582,7 +582,6 @@ static void _test_navigation_type(unsigned line, IUnknown *unk) IHTMLPerformanceNavigation_Release(nav); expected = is_refresh || editmode ? 1 : is_from_hist ? 2 : 0; - todo_wine_if(editmode) ok_(__FILE__,line)(type == expected, "type = %lu, expected %lu\n", type, expected); }
1
0
0
0
Gabriel Ivăncescu : mshtml: Implement performance.navigation.type.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: a44ce98d10e25c2e88d06daf3ae8a4b8fadb50d3 URL:
https://gitlab.winehq.org/wine/wine/-/commit/a44ce98d10e25c2e88d06daf3ae8a4…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:03 2022 +0200 mshtml: Implement performance.navigation.type. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/navigate.c | 7 +++++ dlls/mshtml/omnavigator.c | 4 +-- dlls/mshtml/tests/documentmode.js | 1 + dlls/mshtml/tests/htmldoc.c | 66 ++++++++++++++++++++++++++++++++++++++- dlls/mshtml/tests/reload.js | 1 + 6 files changed, 77 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 7dffea3528f..af1c50c5091 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -508,6 +508,7 @@ typedef struct { LONG ref; + ULONG navigation_type; ULONG redirect_count; ULONGLONG navigation_start_time; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index c69d4a5a0b2..fa6a09c31e3 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1361,6 +1361,13 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc) nsChannelBSC *This = nsChannelBSC_from_BSCallback(bsc); if(This->is_doc_channel) { + DWORD flags = This->bsc.window->base.outer_window->load_flags; + + if(flags & BINDING_FROMHIST) + This->bsc.window->performance_timing->navigation_type = 2; /* TYPE_BACK_FORWARD */ + if(flags & BINDING_REFRESH) + This->bsc.window->performance_timing->navigation_type = 1; /* TYPE_RELOAD */ + This->bsc.window->base.outer_window->base.inner_window->doc->skip_mutation_notif = FALSE; This->bsc.window->performance_timing->navigation_start_time = get_time_stamp(); } diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index ff1e8061bc2..aa9f33567c2 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -1996,9 +1996,9 @@ static HRESULT WINAPI HTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigat { HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface); - FIXME("(%p)->(%p) returning TYPE_NAVIGATE\n", This, p); + TRACE("(%p)->(%p)\n", This, p); - *p = 0; /* TYPE_NAVIGATE */ + *p = This->timing->navigation_type; return S_OK; } diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index a1f0a6bd6a6..8fd97d11cd6 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -90,6 +90,7 @@ sync_test("performance timing", function() { ok(performance.timing.domComplete >= performance.timing.domContentLoadedEventEnd, "domComplete < domContentLoadedEventEnd"); ok(performance.timing.loadEventStart >= performance.timing.domComplete, "loadEventStart < domComplete"); ok(performance.timing.loadEventEnd >= performance.timing.loadEventStart, "loadEventEnd < loadEventStart"); + ok(performance.navigation.type === 0, "navigation type = " + performance.navigation.type); ok(performance.navigation.redirectCount === 0, "redirectCount = " + performance.navigation.redirectCount); }); diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index a4a2207d4d2..b4971e5784d 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -219,7 +219,7 @@ static BOOL set_clientsite, container_locked; static BOOL readystate_set_loading = FALSE, readystate_set_interactive = FALSE, load_from_stream; static BOOL editmode = FALSE, ignore_external_qi; static BOOL inplace_deactivated, open_call; -static BOOL complete, loading_js, loading_hash, is_refresh; +static BOOL complete, loading_js, loading_hash, is_refresh, is_from_hist; static DWORD status_code = HTTP_STATUS_OK; static BOOL asynchronous_binding = FALSE; static BOOL support_wbapp, allow_new_window, no_travellog; @@ -529,6 +529,63 @@ static void _test_performance_timing(unsigned line, IUnknown *unk, const WCHAR * ok_(__FILE__,line)(V_UI8(&var) == 0, "%s is not 0\n", wine_dbgstr_w(prop)); } +#define test_navigation_type(a) _test_navigation_type(__LINE__,a) +static void _test_navigation_type(unsigned line, IUnknown *unk) +{ + IHTMLPerformanceNavigation *nav; + IHTMLPerformance *perf; + DISPPARAMS dp = { 0 }; + ULONG type, expected; + IHTMLWindow2 *window; + IHTMLDocument2 *doc; + IDispatchEx *dispex; + DISPID dispid; + HRESULT hres; + VARIANT var; + BSTR bstr; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc); + ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08lx\n", hres); + + hres = IHTMLDocument2_get_parentWindow(doc, &window); + ok_(__FILE__,line)(hres == S_OK, "get_parentWindow failed: %08lx\n", hres); + IHTMLDocument2_Release(doc); + + hres = IHTMLWindow2_QueryInterface(window, &IID_IDispatchEx, (void**)&dispex); + ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IDispatchEx) failed: %08lx\n", hres); + IHTMLWindow2_Release(window); + + bstr = SysAllocString(L"performance"); + hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &dispid); + ok_(__FILE__,line)(hres == S_OK, "GetDispID(performance) failed: %08lx\n", hres); + SysFreeString(bstr); + + V_VT(&var) = VT_EMPTY; + hres = IDispatchEx_InvokeEx(dispex, dispid, 0, DISPATCH_PROPERTYGET, &dp, &var, NULL, NULL); + ok_(__FILE__,line)(hres == S_OK, "InvokeEx(performance) failed: %08lx\n", hres); + ok_(__FILE__,line)(V_VT(&var) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&var)); + ok_(__FILE__,line)(V_DISPATCH(&var) != NULL, "V_DISPATCH(performance) = NULL\n"); + IDispatchEx_Release(dispex); + + hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLPerformance, (void**)&perf); + ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLPerformance) failed: %08lx\n", hres); + ok_(__FILE__,line)(perf != NULL, "performance is NULL\n"); + VariantClear(&var); + + hres = IHTMLPerformance_get_navigation(perf, &nav); + ok_(__FILE__,line)(hres == S_OK, "get_navigation failed: %08lx\n", hres); + ok_(__FILE__,line)(nav != NULL, "performance.navigation is NULL\n"); + IHTMLPerformance_Release(perf); + + hres = IHTMLPerformanceNavigation_get_type(nav, &type); + ok_(__FILE__,line)(hres == S_OK, "get_type failed: %08lx\n", hres); + IHTMLPerformanceNavigation_Release(nav); + + expected = is_refresh || editmode ? 1 : is_from_hist ? 2 : 0; + todo_wine_if(editmode) + ok_(__FILE__,line)(type == expected, "type = %lu, expected %lu\n", type, expected); +} + static BSTR get_mime_type_display_name(const WCHAR *content_type) { WCHAR buffer[128], ext[128], *str, *progid; @@ -1119,6 +1176,9 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D test_readyState(NULL); readystate_set_interactive = (load_state != LD_INTERACTIVE); + if((!is_refresh && !editmode) || called_Exec_ShellDocView_37) + test_navigation_type(doc_unk); + /* w10pro64_ja has it set to zero despite readyState being interactive, for whatever reason */ if(!is_mhtml) test_performance_timing(doc_unk, L"domInteractive"); @@ -2987,6 +3047,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID ok(nCmdexecopt == 0, "nCmdexecopts=%08lx\n", nCmdexecopt); ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut); ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn); + test_navigation_type(doc_unk); test_performance_timing(doc_unk, L"domComplete"); readystate_set_loading = FALSE; readystate_set_interactive = FALSE; @@ -3661,6 +3722,7 @@ static HRESULT WINAPI DocObjectService_FireNavigateComplete2( { CHECK_EXPECT(FireNavigateComplete2); test_readyState(NULL); + test_navigation_type(doc_unk); test_performance_timing(doc_unk, L"domInteractive"); if(loading_hash) @@ -4508,6 +4570,7 @@ static HRESULT WINAPI WebBrowserPriv_NavigateWithBindCtx(IWebBrowserPriv *iface, trace("NavigateWithBindCtx\n"); CHECK_EXPECT(NavigateWithBindCtx); + test_navigation_type(doc_unk); ok(V_VT(uri) == VT_BSTR, "V_VT(uri) = %d\n", V_VT(uri)); test_NavigateWithBindCtx(V_BSTR(uri), flags, target_frame, post_data, headers, bind_ctx, url_fragment); @@ -5890,6 +5953,7 @@ static void test_download(DWORD flags) else b = &called_Exec_HTTPEQUIV_DONE; is_refresh = (flags & DWL_REFRESH) != 0; + is_from_hist = (flags & DWL_FROM_HISTORY) != 0; hwnd = FindWindowA("Internet Explorer_Hidden", NULL); ok(hwnd != NULL, "Could not find hidden window\n"); diff --git a/dlls/mshtml/tests/reload.js b/dlls/mshtml/tests/reload.js index 04bdf9fcb90..ebd207c14a5 100644 --- a/dlls/mshtml/tests/reload.js +++ b/dlls/mshtml/tests/reload.js @@ -20,6 +20,7 @@ var tests = []; async_test("reload", function() { if(sessionStorage.getItem("skip reload test")) { + ok(performance.navigation.type === 1, "navigation type = " + performance.navigation.type); next_test(); return; }
1
0
0
0
Gabriel Ivăncescu : mshtml: Implement performance.navigation.redirectCount.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: 2e0a5d429e66e06842030bafbebfef9c06a3aa6c URL:
https://gitlab.winehq.org/wine/wine/-/commit/2e0a5d429e66e06842030bafbebfef…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:03 2022 +0200 mshtml: Implement performance.navigation.redirectCount. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/navigate.c | 7 +++++-- dlls/mshtml/omnavigator.c | 24 ++++++++++++++++-------- dlls/mshtml/tests/documentmode.js | 1 + 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c1d2cacd776..7dffea3528f 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -508,6 +508,8 @@ typedef struct { LONG ref; + ULONG redirect_count; + ULONGLONG navigation_start_time; ULONGLONG unload_event_start_time; ULONGLONG unload_event_end_time; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 20eea5024d6..c69d4a5a0b2 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1723,8 +1723,11 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG progress, ULONG t This->nschannel->content_type = strdupWtoA(status_text); break; case BINDSTATUS_REDIRECTING: - if(This->is_doc_channel && !This->bsc.window->performance_timing->redirect_time) - This->bsc.window->performance_timing->redirect_time = get_time_stamp(); + if(This->is_doc_channel) { + This->bsc.window->performance_timing->redirect_count++; + if(!This->bsc.window->performance_timing->redirect_time) + This->bsc.window->performance_timing->redirect_time = get_time_stamp(); + } return handle_redirect(This, status_text); case BINDSTATUS_FINDINGRESOURCE: if(This->is_doc_channel && !This->bsc.window->performance_timing->dns_lookup_time) diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index c36673430d0..ff1e8061bc2 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -1901,6 +1901,7 @@ typedef struct { IHTMLPerformanceNavigation IHTMLPerformanceNavigation_iface; LONG ref; + HTMLPerformanceTiming *timing; } HTMLPerformanceNavigation; static inline HTMLPerformanceNavigation *impl_from_IHTMLPerformanceNavigation(IHTMLPerformanceNavigation *iface) @@ -1948,6 +1949,7 @@ static ULONG WINAPI HTMLPerformanceNavigation_Release(IHTMLPerformanceNavigation TRACE("(%p) ref=%ld\n", This, ref); if(!ref) { + IHTMLPerformanceTiming_Release(&This->timing->IHTMLPerformanceTiming_iface); release_dispex(&This->dispex); free(This); } @@ -2003,8 +2005,11 @@ static HRESULT WINAPI HTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigat static HRESULT WINAPI HTMLPerformanceNavigation_get_redirectCount(IHTMLPerformanceNavigation *iface, ULONG *p) { HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + *p = This->timing->redirect_count; + return S_OK; } static HRESULT WINAPI HTMLPerformanceNavigation_toString(IHTMLPerformanceNavigation *iface, BSTR *string) @@ -2055,7 +2060,7 @@ typedef struct { LONG ref; IHTMLPerformanceNavigation *navigation; - IHTMLPerformanceTiming *timing; + HTMLPerformanceTiming *timing; } HTMLPerformance; static inline HTMLPerformance *impl_from_IHTMLPerformance(IHTMLPerformance *iface) @@ -2103,7 +2108,7 @@ static ULONG WINAPI HTMLPerformance_Release(IHTMLPerformance *iface) TRACE("(%p) ref=%ld\n", This, ref); if(!ref) { - IHTMLPerformanceTiming_Release(This->timing); + IHTMLPerformanceTiming_Release(&This->timing->IHTMLPerformanceTiming_iface); if(This->navigation) IHTMLPerformanceNavigation_Release(This->navigation); release_dispex(&This->dispex); @@ -2164,6 +2169,9 @@ static HRESULT WINAPI HTMLPerformance_get_navigation(IHTMLPerformance *iface, navigation->IHTMLPerformanceNavigation_iface.lpVtbl = &HTMLPerformanceNavigationVtbl; navigation->ref = 1; + navigation->timing = This->timing; + IHTMLPerformanceTiming_AddRef(&This->timing->IHTMLPerformanceTiming_iface); + init_dispatch(&navigation->dispex, (IUnknown*)&navigation->IHTMLPerformanceNavigation_iface, &HTMLPerformanceNavigation_dispex, dispex_compat_mode(&This->dispex)); @@ -2180,7 +2188,7 @@ static HRESULT WINAPI HTMLPerformance_get_timing(IHTMLPerformance *iface, IHTMLP TRACE("(%p)->(%p)\n", This, p); - IHTMLPerformanceTiming_AddRef(*p = This->timing); + IHTMLPerformanceTiming_AddRef(*p = &This->timing->IHTMLPerformanceTiming_iface); return S_OK; } @@ -2240,10 +2248,10 @@ HRESULT create_performance(HTMLInnerWindow *window, IHTMLPerformance **ret) init_dispatch(&performance->dispex, (IUnknown*)&performance->IHTMLPerformance_iface, &HTMLPerformance_dispex, compat_mode); - performance->timing = &window->performance_timing->IHTMLPerformanceTiming_iface; - IHTMLPerformanceTiming_AddRef(performance->timing); + performance->timing = window->performance_timing; + IHTMLPerformanceTiming_AddRef(&performance->timing->IHTMLPerformanceTiming_iface); - init_dispatch(&window->performance_timing->dispex, (IUnknown*)&window->performance_timing->IHTMLPerformanceTiming_iface, + init_dispatch(&performance->timing->dispex, (IUnknown*)&performance->timing->IHTMLPerformanceTiming_iface, &HTMLPerformanceTiming_dispex, compat_mode); *ret = &performance->IHTMLPerformance_iface; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 3965c8ec41b..a1f0a6bd6a6 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -90,6 +90,7 @@ sync_test("performance timing", function() { ok(performance.timing.domComplete >= performance.timing.domContentLoadedEventEnd, "domComplete < domContentLoadedEventEnd"); ok(performance.timing.loadEventStart >= performance.timing.domComplete, "loadEventStart < domComplete"); ok(performance.timing.loadEventEnd >= performance.timing.loadEventStart, "loadEventEnd < loadEventStart"); + ok(performance.navigation.redirectCount === 0, "redirectCount = " + performance.navigation.redirectCount); }); sync_test("page transition events", function() {
1
0
0
0
Gabriel Ivăncescu : mshtml: Set `reload` load type to Gecko for document reloads.
by Alexandre Julliard
28 Nov '22
28 Nov '22
Module: wine Branch: master Commit: 25f205d9ac4b6c1ac36d3cbdf03b64bd6b15762f URL:
https://gitlab.winehq.org/wine/wine/-/commit/25f205d9ac4b6c1ac36d3cbdf03b64…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Fri Nov 25 19:10:03 2022 +0200 mshtml: Set `reload` load type to Gecko for document reloads. So it can async open with proper binding flags. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/mshtml_private.h | 2 +- dlls/mshtml/navigate.c | 9 ++++++--- dlls/mshtml/nsiface.idl | 15 +++++++++++++++ dlls/mshtml/nsio.c | 22 +++++++++++++++------- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 751e3ffbce5..c1d2cacd776 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1090,7 +1090,7 @@ char *get_nscategory_entry(const char*,const char*) DECLSPEC_HIDDEN; HRESULT create_pending_window(HTMLOuterWindow*,nsChannelBSC*) DECLSPEC_HIDDEN; HRESULT start_binding(HTMLInnerWindow*,BSCallback*,IBindCtx*) DECLSPEC_HIDDEN; -HRESULT async_start_doc_binding(HTMLOuterWindow*,HTMLInnerWindow*) DECLSPEC_HIDDEN; +HRESULT async_start_doc_binding(HTMLOuterWindow*,HTMLInnerWindow*,DWORD) DECLSPEC_HIDDEN; void abort_window_bindings(HTMLInnerWindow*) DECLSPEC_HIDDEN; void set_download_state(HTMLDocumentObj*,int) DECLSPEC_HIDDEN; void call_docview_84(HTMLDocumentObj*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index ae8ec72fd9d..20eea5024d6 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1926,6 +1926,7 @@ HRESULT create_channelbsc(IMoniker *mon, const WCHAR *headers, BYTE *post_data, typedef struct { task_t header; + DWORD flags; HTMLOuterWindow *window; HTMLInnerWindow *pending_window; } start_doc_binding_task_t; @@ -1934,7 +1935,7 @@ static void start_doc_binding_proc(task_t *_task) { start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task; - set_current_mon(task->window, task->pending_window->bscallback->bsc.mon, BINDING_NAVIGATED); + set_current_mon(task->window, task->pending_window->bscallback->bsc.mon, task->flags); start_binding(task->pending_window, &task->pending_window->bscallback->bsc, NULL); } @@ -1946,7 +1947,7 @@ static void start_doc_binding_task_destr(task_t *_task) free(task); } -HRESULT async_start_doc_binding(HTMLOuterWindow *window, HTMLInnerWindow *pending_window) +HRESULT async_start_doc_binding(HTMLOuterWindow *window, HTMLInnerWindow *pending_window, DWORD flags) { start_doc_binding_task_t *task; @@ -1956,6 +1957,7 @@ HRESULT async_start_doc_binding(HTMLOuterWindow *window, HTMLInnerWindow *pendin if(!task) return E_OUTOFMEMORY; + task->flags = flags; task->window = window; task->pending_window = pending_window; IHTMLWindow2_AddRef(&pending_window->base.IHTMLWindow2_iface); @@ -2531,7 +2533,8 @@ static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *dis if(FAILED(hres)) return hres; - hres = load_nsuri(window, nsuri, request_data ? request_data->post_stream : NULL, NULL, LOAD_FLAGS_NONE); + hres = load_nsuri(window, nsuri, request_data ? request_data->post_stream : NULL, NULL, + (flags & BINDING_REFRESH) ? LOAD_FLAGS_IS_REFRESH : LOAD_FLAGS_NONE); nsISupports_Release((nsISupports*)nsuri); return hres; } diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index b28cce0ca09..1e97f1fc63b 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -496,6 +496,16 @@ interface nsIStandardURL : nsIMutable ] interface nsIRequest : nsISupports { + const UINT LOAD_NORMAL = 0; + const UINT LOAD_BACKGROUND = 1 << 1; + const UINT INHIBIT_CACHING = 1 << 7; + const UINT INHIBIT_PERSISTENT_CACHING = 1 << 8; + const UINT LOAD_BYPASS_CACHE = 1 << 9; + const UINT LOAD_FROM_CACHE = 1 << 10; + const UINT VALIDATE_ALWAYS = 1 << 11; + const UINT VALIDATE_NEVER = 1 << 12; + const UINT VALIDATE_ONCE_PER_SESSION = 1 << 13; + nsresult GetName(nsACString *aName); nsresult IsPending(bool *_retval); nsresult GetStatus(nsresult *aStatus); @@ -3936,6 +3946,11 @@ interface nsIDocShellLoadInfo : nsISupports ] interface nsIDocShell : nsIDocShellTreeItem { + const UINT LOAD_CMD_NORMAL = 1; + const UINT LOAD_CMD_RELOAD = 2; + const UINT LOAD_CMD_HISTORY = 4; + const UINT LOAD_CMD_PUSHSTATE = 8; + nsresult LoadURI(nsIURI *uri, nsIDocShellLoadInfo *loadInfo, uint32_t aLoadFlags, bool firstParty); nsresult LoadStream(nsIInputStream *aStream, nsIURI *aURI, const nsACString *aContentType, const nsACString *aContentCharset, nsIDocShellLoadInfo *aLoadInfo); diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index 7799083f616..612d91ed386 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -284,6 +284,7 @@ HRESULT load_nsuri(HTMLOuterWindow *window, nsWineURI *uri, nsIInputStream *post nsChannelBSC *channelbsc, DWORD flags) { nsIWebNavigation *web_navigation; + nsDocShellInfoLoadType load_type; nsIDocShellLoadInfo *load_info; nsIDocShell *doc_shell; HTMLDocumentNode *doc; @@ -308,7 +309,11 @@ HRESULT load_nsuri(HTMLOuterWindow *window, nsWineURI *uri, nsIInputStream *post return E_FAIL; } - nsres = nsIDocShellLoadInfo_SetLoadType(load_info, (flags & LOAD_FLAGS_BYPASS_CACHE) ? loadNormalBypassCache : loadNormal); + if(flags & LOAD_FLAGS_IS_REFRESH) + load_type = (flags & LOAD_FLAGS_BYPASS_CACHE) ? loadReloadBypassCache : loadReloadNormal; + else + load_type = (flags & LOAD_FLAGS_BYPASS_CACHE) ? loadNormalBypassCache : loadNormal; + nsres = nsIDocShellLoadInfo_SetLoadType(load_info, load_type); assert(nsres == NS_OK); if(post_stream) { @@ -905,7 +910,7 @@ static nsresult NSAPI nsChannel_Open2(nsIHttpChannel *iface, nsIInputStream **_r return NS_ERROR_NOT_IMPLEMENTED; } -static HTMLOuterWindow *get_channel_window(nsChannel *This) +static HTMLOuterWindow *get_channel_window(nsChannel *This, UINT32 *load_type) { nsIWebProgress *web_progress = NULL; mozIDOMWindowProxy *mozwindow; @@ -944,6 +949,8 @@ static HTMLOuterWindow *get_channel_window(nsChannel *This) return NULL; } + nsIWebProgress_GetLoadType(web_progress, load_type); + nsres = nsIWebProgress_GetDOMWindow(web_progress, &mozwindow); nsIWebProgress_Release(web_progress); if(NS_FAILED(nsres) || !mozwindow) { @@ -982,8 +989,8 @@ static void start_binding_task_destr(task_t *_task) free(task); } -static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc_channel, nsIStreamListener *listener, - nsISupports *context) +static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc_channel, UINT32 load_type, + nsIStreamListener *listener, nsISupports *context) { nsChannelBSC *bscallback; IMoniker *mon = NULL; @@ -1008,7 +1015,7 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc if(is_doc_channel) { hres = create_pending_window(window, bscallback); if(SUCCEEDED(hres)) - async_start_doc_binding(window, window->pending_window); + async_start_doc_binding(window, window->pending_window, (load_type & LOAD_CMD_RELOAD) ? BINDING_REFRESH : BINDING_NAVIGATED); IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); if(FAILED(hres)) return NS_ERROR_UNEXPECTED; @@ -1035,6 +1042,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen nsISupports *aContext) { nsChannel *This = impl_from_nsIHttpChannel(iface); + UINT32 load_type = LOAD_CMD_NORMAL; HTMLOuterWindow *window = NULL; BOOL is_document_channel; BOOL cancel = FALSE; @@ -1058,7 +1066,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen } } - window = get_channel_window(This); + window = get_channel_window(This, &load_type); if(!window) { ERR("window = NULL\n"); return NS_ERROR_UNEXPECTED; @@ -1088,7 +1096,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen } if(!cancel) - nsres = async_open(This, window, is_document_channel, aListener, aContext); + nsres = async_open(This, window, is_document_channel, load_type, aListener, aContext); if(NS_SUCCEEDED(nsres) && This->load_group) { nsres = nsILoadGroup_AddRequest(This->load_group, (nsIRequest*)&This->nsIHttpChannel_iface,
1
0
0
0
← Newer
1
...
11
12
13
14
15
16
17
...
118
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Results per page:
10
25
50
100
200