wxFileSystem* GetFS() const { return m_FS; }
 
+    // Returns TRUE if the parser is allowed to open given URL (may be forbidden
+    // for security reasons)    
+    virtual bool CanOpenURL(const wxString& url) const { return TRUE; }
+
     // You can simply call this method when you need parsed output.
     // This method does these things:
     // 1. call InitParser(source);
 
     // Called when user clicked on hypertext link. Default behavior is to
     // call LoadPage(loc)
     virtual void OnLinkClicked(const wxHtmlLinkInfo& link);
+    
+    // Called when wxHtmlWindow wants to fetch data from an URL (e.g. when loading
+    // a page or loading an image). The data are downloaded if and only if 
+    // OnOpeningURL returns TRUE.
+    virtual bool OnOpeningURL(const wxString& url) const { return TRUE; }
 
     // Returns a pointer to the parser.
     wxHtmlWinParser *GetParser() const { return m_Parser; }
 
 #include "wx/html/htmlcell.h"
 #include "wx/encconv.h"
 
+class WXDLLEXPORT wxHtmlWindow;
 class WXDLLEXPORT wxHtmlWinParser;
 class WXDLLEXPORT wxHtmlWinTagHandler;
 class WXDLLEXPORT wxHtmlTagsModule;
     friend class wxHtmlWindow;
 
 public:
-    wxHtmlWinParser(wxWindow *wnd = NULL);
+    wxHtmlWinParser(wxHtmlWindow *wnd = NULL);
     ~wxHtmlWinParser();
 
     virtual void InitParser(const wxString& source);
     virtual void DoneParser();
     virtual wxObject* GetProduct();
 
+    virtual bool CanOpenURL(const wxString& url) const;
+
     // Set's the DC used for parsing. If SetDC() is not called,
     // parsing won't proceed
     virtual void SetDC(wxDC *dc, double pixel_scale = 1.0)
     // GetDC()->GetChar...()
 
     // returns associated wxWindow
-    wxWindow *GetWindow() {return m_Window;}
+    wxHtmlWindow *GetWindow() {return m_Window;}
 
     // sets fonts to be used when displaying HTML page.
     void SetFonts(wxString normal_face, wxString fixed_face, const int *sizes);
     wxChar *m_tmpStrBuf;
     size_t  m_tmpStrBufSize;
         // temporary variables used by AddText
-    wxWindow *m_Window;
+    wxHtmlWindow *m_Window;
             // window we're parsing for
     double m_PixelScale;
     wxDC *m_DC;
 
             m_RelatedFrame->SetStatusText(_("Connecting..."), m_RelatedStatusBar);
             Refresh(FALSE);
         }
+        
+        if ( !m_Parser->CanOpenURL(location) )
+        {
+            wxLogError(_("Access denied to document '%s'!"), location.c_str());
+            return FALSE;
+        }
 
         f = m_FS->OpenFile(location);
 
 
 
 #include "wx/html/forcelnk.h"
 #include "wx/html/m_templ.h"
+#include "wx/html/htmlwin.h"
 
 #include "wx/image.h"
 #include "wx/gifdecod.h"
                 wxFSFile *str;
                 wxString tmp = tag.GetParam(wxT("SRC"));
                 wxString mn = wxEmptyString;
+                
+                if ( !m_WParser->CanOpenURL(tmp) )
+                    return FALSE;
 
                 str = m_WParser->GetFS()->OpenFile(tmp);
                 if (tag.HasParam(wxT("WIDTH")))
 
 
 wxList wxHtmlWinParser::m_Modules;
 
-wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser()
+wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindow *wnd) : wxHtmlParser()
 {
     m_tmpStrBuf = NULL;
     m_tmpStrBufSize = 0;
     }
 }
 
-
 wxHtmlWinParser::~wxHtmlWinParser()
 {
     int i, j, k, l, m;
     delete[] m_tmpStrBuf;
 }
 
-
 void wxHtmlWinParser::AddModule(wxHtmlTagsModule *module)
 {
     m_Modules.Append(module);
 }
 
-
-
 void wxHtmlWinParser::RemoveModule(wxHtmlTagsModule *module)
 {
     m_Modules.DeleteObject(module);
 }
 
-
-
 void wxHtmlWinParser::SetFonts(wxString normal_face, wxString fixed_face, const int *sizes)
 {
     int i, j, k, l, m;
                     }
 }
 
-
-
 void wxHtmlWinParser::InitParser(const wxString& source)
 {
     wxHtmlParser::InitParser(source);
     m_Container->InsertCell(new wxHtmlFontCell(CreateCurrentFont()));
 }
 
-
-
 void wxHtmlWinParser::DoneParser()
 {
     m_Container = NULL;
     wxHtmlParser::DoneParser();
 }
 
-
-
 wxObject* wxHtmlWinParser::GetProduct()
 {
     wxHtmlContainerCell *top;
     return top;
 }
 
+bool wxHtmlWinParser::CanOpenURL(const wxString& url) const
+{
+    // FIXME - normalize the URL to full path before passing to
+    //         OnOpeningURL!!
+    if ( m_Window )
+        return m_Window->OnOpeningURL(url);
+    else
+        return TRUE;
+}
 
 void wxHtmlWinParser::AddText(const wxChar* txt)
 {