diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index e5f515f03ee..b32446ec2a2 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -48,6 +48,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define UTF16_STR "utf-16"
static const WCHAR emptyW[] = {0};
+static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
struct nsProtocolStream {
nsIInputStream nsIInputStream_iface;
@@ -614,6 +615,16 @@ static void init_bscallback(BSCallback *This, const BSCallbackVtbl *vtbl, IMonik
This->mon = mon;
}
+static HRESULT read_stream(BSCallback *This, IStream *stream, void *buf, DWORD size, DWORD *ret_size)
+{
+ DWORD read_size = 0;
+ HRESULT hres;
+
+ hres = IStream_Read(stream, buf, size, &read_size);
+ This->readed += (*ret_size = read_size);
+ return hres;
+}
+
static void parse_content_type(nsChannelBSC *This, const WCHAR *value)
{
const WCHAR *ptr;
@@ -820,9 +831,7 @@ static HRESULT BufferBSC_read_data(BSCallback *bsc, IStream *stream)
This->buf = heap_realloc(This->buf, This->size);
}
- readed = 0;
- hres = IStream_Read(stream, This->buf+This->bsc.readed, This->size-This->bsc.readed, &readed);
- This->bsc.readed += readed;
+ hres = read_stream(&This->bsc, stream, This->buf+This->bsc.readed, This->size-This->bsc.readed, &readed);
}while(hres == S_OK);
return S_OK;
@@ -1031,8 +1040,6 @@ static void on_stop_nsrequest(nsChannelBSC *This, HRESULT result)
static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
{
- static const WCHAR mimeTextHtml[] = {'t','e','x','t','/','h','t','m','l',0};
-
DWORD read;
nsresult nsres;
HRESULT hres;
@@ -1041,8 +1048,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
BYTE buf[1024];
do {
- read = 0;
- hres = IStream_Read(stream, buf, sizeof(buf), &read);
+ hres = read_stream(&This->bsc, stream, buf, sizeof(buf), &read);
}while(hres == S_OK && read);
return S_OK;
@@ -1052,15 +1058,16 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
This->nsstream = create_nsprotocol_stream();
do {
- read = 0;
- hres = IStream_Read(stream, This->nsstream->buf+This->nsstream->buf_size,
+ BOOL first_read = !This->bsc.readed;
+
+ hres = read_stream(&This->bsc, stream, This->nsstream->buf+This->nsstream->buf_size,
sizeof(This->nsstream->buf)-This->nsstream->buf_size, &read);
if(!read)
break;
This->nsstream->buf_size += read;
- if(!This->bsc.readed) {
+ if(first_read) {
if(This->nsstream->buf_size >= 2
&& (BYTE)This->nsstream->buf[0] == 0xff
&& (BYTE)This->nsstream->buf[1] == 0xfe)
@@ -1075,7 +1082,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
WCHAR *mime;
hres = FindMimeFromData(NULL, NULL, This->nsstream->buf, This->nsstream->buf_size,
- This->is_doc_channel ? mimeTextHtml : NULL, 0, &mime, 0);
+ This->is_doc_channel ? text_htmlW : NULL, 0, &mime, 0);
if(FAILED(hres))
return hres;
@@ -1090,8 +1097,6 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
on_start_nsrequest(This);
}
- This->bsc.readed += This->nsstream->buf_size;
-
nsres = nsIStreamListener_OnDataAvailable(This->nslistener,
(nsIRequest*)&This->nschannel->nsIHttpChannel_iface, This->nscontext,
&This->nsstream->nsIInputStream_iface, This->bsc.readed-This->nsstream->buf_size,