我试图阻止由TEmbeddedWB或TWebBrowser(或TCppWebBrowser)加载的任何外部.我想阻止从Internet加载的任何内容,包括图像, javascript,外部CSS,外部或[object]或[applet]或[frame]或[iframe],执行可以加载外部内容
这个问题由两部分组成:
>将网络浏览器置于“限制所有”(除了没有图像的基本HTML)之外,并检测是否存在此类内容
>如果外部内容不存在,如果是,则显示“下载栏”,点击后将网页浏览器置于“全部下载”模式并获取所有内容.
第一项有问题.在TEmbeddedWB中,您可以使用DownloadOptions开关阻止几乎所有内容,最重要的是ForceOffline切换,但即使关闭了所有内容,它仍然会通过[object]或[iframe]标签等内容.我知道情况就是这样,因为我实现了OnBeforeNavigate2事件并触发了这些标记中包含的URL,并且它还在本地服务器的日志中创建了一个条目.在TEmbeddedWB中设置OfflineMode和ForceOfflineMode对这些项目没有帮助.
那么我怎么能真正阻止所有呢?所以它需要从包含脚本和CSS的被阻止的外部元素开始作为基本HTML.有没有办法在每次想要下载任何东西时触发事件,以便阻止所有外部下载,或者首先避免触发此类事件?我是否需要摆弄Internet Explorer区域和安全性?任何正确方向的指针都会有所帮助.
第二项也很棘手,因为我需要检测是否存在有问题的标签(例如“applet”,“script”,“link”等.这种检测不需要完美,但它必须至少足以覆盖大多数这样的标签.我这样做了:
//---------------------------------------------------------------------- // Check for external content (images, scripts, ActiveX, frames...) //---------------------------------------------------------------------- try { bool HasExternalContent = false; DelphiInterface<IHTMLDocument2> diDoc; // Smart pointer wrapper - should automatically call release() and do reference counting diDoc = TEmbeddedWB->Document; DelphiInterface<IHTMLElementCollection> diColApplets; DelphiInterface<IDispatch> diDispApplets; DelphiInterface<IHTMLObjectElement> diObj; DelphiInterface<IHTMLElementCollection> diColEmbeds; DelphiInterface<IDispatch> diDispEmbeds; DelphiInterface<IHTMLFramesCollection2> diColFrames; DelphiInterface<IDispatch> diDispFrames; DelphiInterface<IHTMLElementCollection> diColImages; DelphiInterface<IDispatch> diDispImages; DelphiInterface<IHTMLImgElement> diImg; DelphiInterface<IHTMLElementCollection> diColLinks; DelphiInterface<IDispatch> diDispLinks; DelphiInterface<IHTMLElementCollection> diColPlugins; DelphiInterface<IDispatch> diDispPlugins; DelphiInterface<IHTMLElementCollection> diColScripts; DelphiInterface<IDispatch> diDispScripts; DelphiInterface<IHTMLStyleSheetsCollection> diColStyleSheets; DelphiInterface<IDispatch> diDispStyleSheets; OleCheck(diDoc->Get_applets (diColApplets)); OleCheck(diDoc->Get_embeds (diColEmbeds)); OleCheck(diDoc->Get_frames (diColFrames)); OleCheck(diDoc->Get_images (diColImages)); OleCheck(diDoc->Get_links (diColLinks)); OleCheck(diDoc->Get_plugins (diColPlugins)); OleCheck(diDoc->Get_scripts (diColScripts)); OleCheck(diDoc->Get_styleSheets (diColStyleSheets)); // Scan for applets external links for (int i = 0; i < diColApplets->length; i++) { OleCheck(diColApplets->item(i,i,diDispApplets)); if (diDispApplets != NULL) { diDispApplets->QueryInterface(IID_IHTMLObjectElement, (void**)&diObj); if (diObj != NULL) { UnicodeString s1 = Sysutils::Trim(diObj->data), s2 = Sysutils::Trim(diObj->codeBase), s3 = Sysutils::Trim(diObj->classid); if (StartsText("http", s1) || StartsText("http", s2) || StartsText("http", s3)) { HasExternalContent = true; break; // At least 1 found, bar will be shown, no further search needed } } } } // Scan for images external links for (int i = 0; i < diColImages->length; i++) { OleCheck(diColImages->item(i,i,diDispImages)); if (diDispImages != NULL) // Unnecessary? OleCheck throws exception if this applies? { diDispImages->QueryInterface(IID_IHTMLImgElement, (void**)&diImg); if (diImg != NULL) { UnicodeString s1 = Sysutils::Trim(diImg->src); // Case insensitive check if (StartsText("http", s1)) { HasExternalContent = true; break; // At least 1 found, bar will be shown, no further search needed } } } } } catch (Exception &e) { // triggered by OleCheck ShowMessage(e.Message); }
有没有更简单的方法来扫描这个或唯一的一个是使用其他接口函数运行几个循环,如Get_applets,Get_embeds,Get_stylesheets等类似于上面的代码?到目前为止,我发现我必须调用以下函数来涵盖所有这些:
OleCheck(diDoc->Get_applets (diColApplets)); OleCheck(diDoc->Get_embeds (diColEmbeds)); OleCheck(diDoc->Get_frames (diColFrames)); OleCheck(diDoc->Get_images (diColImages)); OleCheck(diDoc->Get_links (diColLinks)); OleCheck(diDoc->Get_plugins (diColPlugins)); OleCheck(diDoc->Get_scripts (diColScripts)); OleCheck(diDoc->Get_styleSheets (diColStyleSheets));
但是如果可以更容易地处理这个问题,我宁愿不实现那么多循环.它可以?
我建议你这个解决方案:#include "html.h" THTMLDocument doc; void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL) { doc.documentFromVariant(CppWebBrowser1->Document); bool HasExternalContent = false; for (int i=0; i<doc.images.length; i++) { if(doc.images[i].src.SubString(1, 4) == "http") { HasExternalContent = true; break; } } for (int i=0; i<doc.applets.length; i++) { THTMLObjectElement obj = doc.applets[i]; if(obj.data.SubString(1, 4) == "http") HasExternalContent = true; if(obj.codeBase.SubString(1, 4) == "http") HasExternalContent = true; if(obj.classid.SubString(1, 4) == "http") HasExternalContent = true; } }
这个greate包装类可以从here下载.