前言

经常接到需求想定制一个浏览器,把服务器返回的特定的js/css/html页面的内容做一下修改,或者替换图片之类,这种需求我一般使用VisualFreeBasic+Miniblink来做开发。

最近在使用uniapp生成的网页来做程序的UI,但是发现uniapp只要使用到了leftwindow的页面,在Miniblink上都无法正常显示边栏。

例如https://hellouniapp.dcloud.net.cn/ 用谷歌浏览器打开和Miniblink打开差别是左边的边栏没有显示。

通过调试跟踪,发现是uniapp编译出来的chunk-vendors.js,如果使用css var特性,进行特性检查的时候返回为false,就放弃渲染leftwindow了,但是其实大部分的css var特性Miniblink是支持的。

uniapp我们无法修改,Miniblink我提交了issue了,那我们只能自己在加载的时候做一下兼容处理。

一、Miniblink是什么?

Miniblink 是基于C语言的浏览器组件,由国内浏览器行业的大咖龙泉扫地僧开发,调用只有一个dll文件,程序压缩之后只有10M,是我见过最小的浏览器组件,没有之一。

二、使用步骤

1.导入mb.dll声明

'MB_EXTERN_C __declspec(dllexport) void MB_CALL_TYPE mbInit(const mbSettings* settings);
Declare Sub mbInit Lib "mb" Alias "mbInit"(ByVal mbSettings As Long)'ITERATOR0(void, mbUninit, "")
Declare Sub mbUninit Lib "mb" Alias "mbUninit"()'ITERATOR6(mbWebView, mbCreateWebWindow, mbWindowType type, HWND parent, int x, int y, int width, int height, "") \
Declare Function mbCreateWebWindow Lib "mb" Alias "mbCreateWebWindow"(ByVal mbWindowType As Long ,ByVal parent As Long ,ByVal x As Long ,ByVal y As Long ,ByVal width As Long ,ByVal height As Long) As Long'ITERATOR2(void, mbShowWindow, mbWebView webview, BOOL show, "") \
Declare Sub mbShowWindow Lib "mb" Alias "mbShowWindow"(ByVal mbWebView As Long ,ByVal show As Long)'ITERATOR2(void, mbLoadURL, mbWebView webView, const utf8* url, "") \
Declare Sub mbLoadURL Lib "mb" Alias "mbLoadURL"(ByVal mbWebView As Long , url_utf8 As ZString Ptr)'void mbSetDebugConfig(mbWebView webView, const char* debugString, const char* param)
Declare Sub mbSetDebugConfig Lib "mb" Alias "mbSetDebugConfig"(ByVal mbWebView As Long ,debugString As ZString ,param As ZString)'ITERATOR3(void, mbOnLoadUrlBegin, mbWebView webView, mbLoadUrlBeginCallback callback, void* callbackParam, "") \
Declare Sub mbOnLoadUrlBegin Lib "mb" Alias "mbOnLoadUrlBegin"(ByVal mbWebView As Long ,ByVal callback As Any Ptr, ByVal param As lParam)'ITERATOR3(void, mbOnLoadUrlEnd, mbWebView webView, mbLoadUrlEndCallback callback, void* callbackParam, "") \
Declare Sub mbOnLoadUrlEnd Lib "mb" Alias "mbOnLoadUrlEnd"(ByVal mbWebView As Long ,ByVal callback As Any Ptr, ByVal param As lParam)'ITERATOR1(void, mbNetHookRequest, mbNetJob jobPtr, "") \
Declare Sub mbNetHookRequest Lib "mb" Alias "mbNetHookRequest"(ByVal jobPtr As Any Ptr)'ITERATOR2(void, mbNetSetMIMEType, mbNetJob jobPtr, const char* type, "") \
Declare Sub mbNetSetMIMEType Lib "mb" Alias "mbNetSetMIMEType"(ByVal jobPtr As Any Ptr, _type As ZString Ptr)'ITERATOR3(void, mbNetSetData, mbNetJob jobPtr, void* buf, int len, "") \
Declare Sub mbNetSetData Lib "mb" Alias "mbNetSetData"(ByVal jobPtr As Any Ptr, buf As Any Ptr, _len As Integer)

2.加载时创建浏览器

Dim Shared MainForm_WebView As Integer
Sub MainForm_Shown(hWndForm As hWnd ,UserData As Integer) '窗口完全显示后。UserData 来自显示窗口最后1个参数。mbInit 0MainForm_WebView = mbCreateWebWindow(MB_WINDOW_TYPE_CONTROL ,Me.hWnd ,0 ,0 ,Me.ScaleWidth ,Me.ScaleHeight)mbShowWindow MainForm_WebView ,TruembOnLoadUrlBegin MainForm_WebView ,@MainForm_mbLoadUrlBeginCallback ,0mbOnLoadUrlEnd MainForm_WebView, @MainForm_mbLoadUrlEndCallback, 0mbLoadURL MainForm_WebView ,"https://hellouniapp.dcloud.net.cn/"
End Sub

3.处理mbLoadUrlBeginCallback回调

此回调的作用,是通过url匹配,判断是的继续向服务器发出请求:

Return False表示浏览器继续向服务器发出请求,在返回之前调用mbNetHookRequest才会触发mbLoadUrlEndCallback回调
Return True表示中断请求,则在此可以直接调用mbNetSetData模拟返回内容

'typedef BOOL(MB_CALL_TYPE *mbLoadUrlBeginCallback)(mbWebView webView, void* param, const char* url, mbNetJob job);
Function MainForm_mbLoadUrlBeginCallback(webView As Long ,param As lParam ,url_utf8 As ZString, job As Long) As BOOLIf InStr(url_utf8 ,"/static/js/chunk-vendors.js") > 0 ThenmbNetHookRequest jobReturn FalseEnd IfReturn False
End Function

4.处理mbLoadUrlEndCallback回调

'typedef void(MB_CALL_TYPE *mbLoadUrlEndCallback)(mbWebView webView, void* param, const char* url, mbNetJob job, void* buf, int len);
Sub MainForm_mbLoadUrlEndCallback(webView As Long ,param As lParam ,url_utf8 As ZString ,job As Any Ptr ,buf As ZString Ptr , _len As Integer)If _len > 0 And InStr(url_utf8 ,"/static/js/chunk-vendors.js") > 0 ThenDim As String strTmp = Utf8toStr(*buf)      strTmp = FF_Replace(strTmp ,"this.topWindow||this.leftWindow||this.rightWindow)&&uni.canIUse(""css.var"")&&window.matchMedia" ,"this.topWindow||this.leftWindow||this.rightWindow)&&window.matchMedia")Dim As String strOut = StrToUtf8(strTmp)mbNetSetMIMEType(job ,"text/javascript; charset=UTF-8")mbNetSetData(job ,StrPtr(strOut) ,Len(strOut))ReturnEnd If
End Sub

总结

这篇文章做了一下Miniblink在vfb下的调用和回调的处理,通过拦截请求并修改返回的内容,修正uniapp和Miniblink的兼容问题,举一反三,这个也可以实现把浏览器的请求拦截、保存、修改。

VisualFreeBasic+Miniblink做浏览器实现js内容替换相关推荐

  1. JS字符串替换函数全部替换方法

    JS字符串替换函数全部替换方法 正则表达式浏览器HTML  JS字符串替换函数:Replace("字符串1″, "字符串2″), 1.我们都知道JS中字符串替换函数是Replace ...

  2. C# 封装miniblink 使用HTML/CSS/JS来构建.Net 应用程序界面和简易浏览器

    C# 封装miniblink 使用HTML/CSS/JS来构建.Net 应用程序界面和简易浏览器 MiniBlink的作者是 龙泉寺扫地僧 miniblink是什么?   (抄了一下 龙泉寺扫地僧 写 ...

  3. JS 字符串替换特定子串

    JS 字符串替换函数-replace 前言 基本说明 定义与语法 返回值 说明 拓展说明1 java中的字符替换操作 JS实现全替换的效果 拓展说明2 replacement 是字符串时 replac ...

  4. js 字符串替换的问题

    1 <html> 2 <head> 3 <title>js 字符串替换问题</title> 4 <meta http-equiv="co ...

  5. cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

    老刘 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么. 今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲.假定本机已经获取了I ...

  6. php修改js内容,js怎样修改html元素的内容?HTML DOM实现修改内容

    js怎样修改html元素的内容?本章就给大家介绍在js中利用HTML DOM是怎样修改html元素内容的.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们要了解HTML DO ...

  7. html浏览器pc端禁止缩放,阻止pc端浏览器缩放js代码

    阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上即可,但是pc端确实比较麻烦,用户可以通过如下几种方式来缩放: windows: ctrl + +/- ctrl + 滚轮 浏 ...

  8. 火狐浏览器调试js技巧_充分利用Firefox的最佳技巧和调整

    火狐浏览器调试js技巧 Firefox is one of the more popular web browsers that runs on Windows, Linux, and Mac OS ...

  9. JSPatch实现原理详解:让JS调用/替换任意OC方法

    JSPatch实现原理详解:让JS调用/替换任意OC方法 2015-07-10 09:05 编辑: suiling 分类:iOS开发 来源:bang JSPatch以小巧的体积做到了让JS调用/替换任 ...

最新文章

  1. 如何挖掘系统的业务价值
  2. 电容二极管升压电路分析
  3. Kotlin-如何创建一个好用的协程作用域
  4. springboot日志自定义路径无效及出现org.springframework.boot.context.properties.bind.BindException错误
  5. PHP自动加载spl_autoload_register()
  6. CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息
  7. 【无码专区2】序列划分(数学)
  8. mpiBlast安装详解以及使用说明
  9. java 弹框_java弹框
  10. mysql中chr_MySQL常见函数
  11. 【语音处理】基于matlab GUI音频信号处理(调音+调速+调频+滤波)(带面板)【含Matlab源码 299期】
  12. Windows数据类型探幽
  13. 开源可视化网页抓取工具Portia 爬虫
  14. nagios——短讯报警
  15. ADODB.Stream 错误 '800a0bb9' 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突
  16. Hibernate 的 could not initialize proxy - the owning Session was closed问题
  17. 切线空间?切线空间的作用到底是什么?
  18. 25.有5个人做在一起, 问第五个人多少岁? 他说比第四个人大2岁. 问第四个人岁数, 他说比第是三个人大2岁. 问第三个人, 又说比第二人大两岁. 问第二个人, 说比第一个人大两岁. 最后问第一个人
  19. linux jmap命令详解,jmap命令 linux jmap如何使用
  20. 神经网络中的阈值是什么

热门文章

  1. Photoshop CC 2019( ps cc)新增功能使用方法介绍
  2. tkinter模块常用控件及描述
  3. 如何设置条码数据的对齐方式
  4. C++ strIcmp 字符串大小比较
  5. 毕业设计 Stm32家庭有害气体检测系统 - 物联网 嵌入式 单片机
  6. 基于SSM汽车维修管理系统-连锁店版
  7. open_nsfw: 雅虎基于Caffe的成人图片识别模型
  8. 西门子界面官方精美触摸屏+WINCC程序模板 西门子官方触摸屏程序模板,炫酷的扁平式动画效果,脚本动画,自动生成二维码,可仿真,堪比智能手机,有精简,精致,wincc,无线面板等包含了所有西门子人机界
  9. 入手评测 i911900h和r75800h选哪个好
  10. 每日新闻丨英伟达发布全球最小边缘AI超级计算机;IBM开发出全球首个金融服务就绪公有云...