Correctly use QueryInterface in GetDocument to ensure that we only return an IHTMLDocument2 pointer if one is available. Check GetDocument being NULL when used. This fixes the displaying of non-html documents such as pdfs.
Fixes #14060 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71030 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -122,6 +122,10 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
|
|||||||
hr = SafeArrayUnaccessData(psaStrings);
|
hr = SafeArrayUnaccessData(psaStrings);
|
||||||
|
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
|
|
||||||
|
if(!document)
|
||||||
|
return;
|
||||||
|
|
||||||
document->write(psaStrings);
|
document->write(psaStrings);
|
||||||
document->close();
|
document->close();
|
||||||
document->Release();
|
document->Release();
|
||||||
@@ -140,6 +144,10 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
|
|||||||
hr = SafeArrayUnaccessData(psaStrings);
|
hr = SafeArrayUnaccessData(psaStrings);
|
||||||
|
|
||||||
document = GetDocument();
|
document = GetDocument();
|
||||||
|
|
||||||
|
if(!document)
|
||||||
|
return;
|
||||||
|
|
||||||
document->write(psaStrings);
|
document->write(psaStrings);
|
||||||
document->Release();
|
document->Release();
|
||||||
|
|
||||||
@@ -172,25 +180,33 @@ void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
|
|||||||
wxString wxWebViewIE::GetPageSource() const
|
wxString wxWebViewIE::GetPageSource() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLElement *bodyTag = NULL;
|
|
||||||
IHTMLElement *htmlTag = NULL;
|
if(document)
|
||||||
wxString source;
|
|
||||||
HRESULT hr = document->get_body(&bodyTag);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
hr = bodyTag->get_parentElement(&htmlTag);
|
IHTMLElement *bodyTag = NULL;
|
||||||
|
IHTMLElement *htmlTag = NULL;
|
||||||
|
wxString source;
|
||||||
|
HRESULT hr = document->get_body(&bodyTag);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
BSTR bstr;
|
hr = bodyTag->get_parentElement(&htmlTag);
|
||||||
htmlTag->get_outerHTML(&bstr);
|
if(SUCCEEDED(hr))
|
||||||
source = wxString(bstr);
|
{
|
||||||
htmlTag->Release();
|
BSTR bstr;
|
||||||
|
htmlTag->get_outerHTML(&bstr);
|
||||||
|
source = wxString(bstr);
|
||||||
|
htmlTag->Release();
|
||||||
|
}
|
||||||
|
bodyTag->Release();
|
||||||
}
|
}
|
||||||
bodyTag->Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
document->Release();
|
document->Release();
|
||||||
return source;
|
return source;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxWebViewZoom wxWebViewIE::GetZoom() const
|
wxWebViewZoom wxWebViewIE::GetZoom() const
|
||||||
@@ -521,11 +537,18 @@ wxString wxWebViewIE::GetCurrentURL() const
|
|||||||
wxString wxWebViewIE::GetCurrentTitle() const
|
wxString wxWebViewIE::GetCurrentTitle() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
BSTR title;
|
|
||||||
|
|
||||||
document->get_nameProp(&title);
|
if(document)
|
||||||
document->Release();
|
{
|
||||||
return wxString(title);
|
BSTR title;
|
||||||
|
document->get_nameProp(&title);
|
||||||
|
document->Release();
|
||||||
|
return wxString(title);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWebViewIE::CanCut() const
|
bool wxWebViewIE::CanCut() const
|
||||||
@@ -579,24 +602,36 @@ void wxWebViewIE::Redo()
|
|||||||
void wxWebViewIE::SetEditable(bool enable)
|
void wxWebViewIE::SetEditable(bool enable)
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
if( enable )
|
|
||||||
document->put_designMode(SysAllocString(L"On"));
|
|
||||||
else
|
|
||||||
document->put_designMode(SysAllocString(L"Off"));
|
|
||||||
|
|
||||||
document->Release();
|
if(document)
|
||||||
|
{
|
||||||
|
if( enable )
|
||||||
|
document->put_designMode(SysAllocString(L"On"));
|
||||||
|
else
|
||||||
|
document->put_designMode(SysAllocString(L"Off"));
|
||||||
|
|
||||||
|
document->Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWebViewIE::IsEditable() const
|
bool wxWebViewIE::IsEditable() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
BSTR mode;
|
|
||||||
document->get_designMode(&mode);
|
if(document)
|
||||||
document->Release();
|
{
|
||||||
if(wxString(mode) == "On")
|
BSTR mode;
|
||||||
return true;
|
document->get_designMode(&mode);
|
||||||
|
document->Release();
|
||||||
|
if(wxString(mode) == "On")
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::SelectAll()
|
void wxWebViewIE::SelectAll()
|
||||||
@@ -607,18 +642,26 @@ void wxWebViewIE::SelectAll()
|
|||||||
bool wxWebViewIE::HasSelection() const
|
bool wxWebViewIE::HasSelection() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLSelectionObject* selection;
|
|
||||||
wxString sel;
|
if(document)
|
||||||
HRESULT hr = document->get_selection(&selection);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
BSTR type;
|
IHTMLSelectionObject* selection;
|
||||||
selection->get_type(&type);
|
wxString sel;
|
||||||
sel = wxString(type);
|
HRESULT hr = document->get_selection(&selection);
|
||||||
selection->Release();
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
BSTR type;
|
||||||
|
selection->get_type(&type);
|
||||||
|
sel = wxString(type);
|
||||||
|
selection->Release();
|
||||||
|
}
|
||||||
|
document->Release();
|
||||||
|
return sel != "None";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
return sel != "None";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::DeleteSelection()
|
void wxWebViewIE::DeleteSelection()
|
||||||
@@ -629,108 +672,140 @@ void wxWebViewIE::DeleteSelection()
|
|||||||
wxString wxWebViewIE::GetSelectedText() const
|
wxString wxWebViewIE::GetSelectedText() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLSelectionObject* selection;
|
|
||||||
wxString selected;
|
if(document)
|
||||||
HRESULT hr = document->get_selection(&selection);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
IDispatch* disrange;
|
IHTMLSelectionObject* selection;
|
||||||
hr = selection->createRange(&disrange);
|
wxString selected;
|
||||||
|
HRESULT hr = document->get_selection(&selection);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
IHTMLTxtRange* range;
|
IDispatch* disrange;
|
||||||
hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
|
hr = selection->createRange(&disrange);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
BSTR text;
|
IHTMLTxtRange* range;
|
||||||
range->get_text(&text);
|
hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
|
||||||
selected = wxString(text);
|
if(SUCCEEDED(hr))
|
||||||
range->Release();
|
{
|
||||||
|
BSTR text;
|
||||||
|
range->get_text(&text);
|
||||||
|
selected = wxString(text);
|
||||||
|
range->Release();
|
||||||
|
}
|
||||||
|
disrange->Release();
|
||||||
}
|
}
|
||||||
disrange->Release();
|
selection->Release();
|
||||||
}
|
}
|
||||||
selection->Release();
|
document->Release();
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
return selected;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString wxWebViewIE::GetSelectedSource() const
|
wxString wxWebViewIE::GetSelectedSource() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLSelectionObject* selection;
|
|
||||||
wxString selected;
|
if(document)
|
||||||
HRESULT hr = document->get_selection(&selection);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
IDispatch* disrange;
|
IHTMLSelectionObject* selection;
|
||||||
hr = selection->createRange(&disrange);
|
wxString selected;
|
||||||
|
HRESULT hr = document->get_selection(&selection);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
IHTMLTxtRange* range;
|
IDispatch* disrange;
|
||||||
hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
|
hr = selection->createRange(&disrange);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
BSTR text;
|
IHTMLTxtRange* range;
|
||||||
range->get_htmlText(&text);
|
hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
|
||||||
selected = wxString(text);
|
if(SUCCEEDED(hr))
|
||||||
range->Release();
|
{
|
||||||
|
BSTR text;
|
||||||
|
range->get_htmlText(&text);
|
||||||
|
selected = wxString(text);
|
||||||
|
range->Release();
|
||||||
|
}
|
||||||
|
disrange->Release();
|
||||||
}
|
}
|
||||||
disrange->Release();
|
selection->Release();
|
||||||
}
|
}
|
||||||
selection->Release();
|
document->Release();
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
return selected;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::ClearSelection()
|
void wxWebViewIE::ClearSelection()
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLSelectionObject* selection;
|
|
||||||
wxString selected;
|
if(document)
|
||||||
HRESULT hr = document->get_selection(&selection);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
selection->empty();
|
IHTMLSelectionObject* selection;
|
||||||
selection->Release();
|
wxString selected;
|
||||||
|
HRESULT hr = document->get_selection(&selection);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
selection->empty();
|
||||||
|
selection->Release();
|
||||||
|
}
|
||||||
|
document->Release();
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString wxWebViewIE::GetPageText() const
|
wxString wxWebViewIE::GetPageText() const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
wxString text;
|
|
||||||
IHTMLElement* body;
|
if(document)
|
||||||
HRESULT hr = document->get_body(&body);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
BSTR out;
|
wxString text;
|
||||||
body->get_innerText(&out);
|
IHTMLElement* body;
|
||||||
text = wxString(out);
|
HRESULT hr = document->get_body(&body);
|
||||||
body->Release();
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
BSTR out;
|
||||||
|
body->get_innerText(&out);
|
||||||
|
text = wxString(out);
|
||||||
|
body->Release();
|
||||||
|
}
|
||||||
|
document->Release();
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
return text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::RunScript(const wxString& javascript)
|
void wxWebViewIE::RunScript(const wxString& javascript)
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
IHTMLWindow2* window;
|
|
||||||
wxString language = "javascript";
|
if(document)
|
||||||
HRESULT hr = document->get_parentWindow(&window);
|
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
VARIANT level;
|
IHTMLWindow2* window;
|
||||||
VariantInit(&level);
|
wxString language = "javascript";
|
||||||
V_VT(&level) = VT_EMPTY;
|
HRESULT hr = document->get_parentWindow(&window);
|
||||||
window->execScript(SysAllocString(javascript.wc_str()),
|
if(SUCCEEDED(hr))
|
||||||
SysAllocString(language.wc_str()),
|
{
|
||||||
&level);
|
VARIANT level;
|
||||||
|
VariantInit(&level);
|
||||||
|
V_VT(&level) = VT_EMPTY;
|
||||||
|
window->execScript(SysAllocString(javascript.wc_str()),
|
||||||
|
SysAllocString(language.wc_str()),
|
||||||
|
&level);
|
||||||
|
}
|
||||||
|
document->Release();
|
||||||
}
|
}
|
||||||
document->Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
|
void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
|
||||||
@@ -767,29 +842,49 @@ void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
|
|||||||
bool wxWebViewIE::CanExecCommand(wxString command) const
|
bool wxWebViewIE::CanExecCommand(wxString command) const
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
VARIANT_BOOL enabled;
|
|
||||||
|
|
||||||
document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled);
|
if(document)
|
||||||
document->Release();
|
{
|
||||||
|
VARIANT_BOOL enabled;
|
||||||
|
|
||||||
|
document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled);
|
||||||
|
document->Release();
|
||||||
|
|
||||||
|
return (enabled == VARIANT_TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return (enabled == VARIANT_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWebViewIE::ExecCommand(wxString command)
|
void wxWebViewIE::ExecCommand(wxString command)
|
||||||
{
|
{
|
||||||
IHTMLDocument2* document = GetDocument();
|
IHTMLDocument2* document = GetDocument();
|
||||||
document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL);
|
|
||||||
document->Release();
|
if(document)
|
||||||
|
{
|
||||||
|
document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL);
|
||||||
|
document->Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IHTMLDocument2* wxWebViewIE::GetDocument() const
|
IHTMLDocument2* wxWebViewIE::GetDocument() const
|
||||||
{
|
{
|
||||||
wxVariant variant = m_ie.GetProperty("Document");
|
IDispatch* dispatch;
|
||||||
IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr();
|
HRESULT result = m_webBrowser->get_Document(&dispatch);
|
||||||
|
if(SUCCEEDED(result))
|
||||||
wxASSERT(document);
|
{
|
||||||
|
IHTMLDocument2* document;
|
||||||
return document;
|
dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document);
|
||||||
|
//document is set to null automatically if the interface isn't supported
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWebViewIE::EnableControlFeature(long flag, bool enable)
|
bool wxWebViewIE::EnableControlFeature(long flag, bool enable)
|
||||||
|
Reference in New Issue
Block a user