browser_browsers - CSDN
  • Browser 架构

    2015-03-18 17:40:56
    公司产品的一个架构,这个架构是外国总部那边就设计好的,在这边唯一的一次比较大改动是一个牛人引入了HistoryPart结合ViewPager实现了滑动的前进后退。 ProxyBrowserView 在被构造的时候会被传入BrowserManager, ...
    公司产品的一个架构,这个架构是外国总部那边就设计好的,在这边唯一的一次比较大改动是一个牛人引入了HistoryPart结合ViewPager实现了滑动的前进后退。
    <1> ProxyBrowserView 在被构造的时候会被传入BrowserManager<既是C 也是 一个 ViewPager>, 一个 ProxiedBrowserView,以及一个
    HistoryPart, 如果没有给HistoryPart,那么会new 一个 HistoryPart并且 将此HistoryPart hold的 BrowserView设为此proxiedBrowserView, ProxyBrowserView会维护一个HistoryPart List,在构造时就将传入的HistoryPart加入到维护的HistoryPartList中,有一个commitHistoryPart 会添加输入的HistoryPart到List中, 在animatingToHistoryPart()或者 BrowserManager这个ViewPager的
    某个Page被select时,会调用。
    ProxyBrowserView某种意义上是BrowserView最外层的接口,
    在一个ProxyBrowserView中,因为有一个HistoryPart的list,而每个HistoryPart都对应一个ProxiedBrowserView,那么可以认为
    ProxyBrowserView代表了一群ProxiedBrowserView,但是作为一个浏览器,当然任何时候只能有一个proxiedBrowserView可以被显示或者说
    作为当前的BrowserView,那么这个ProxiedBrowserView选哪个,以及外界有操作引起ProxiedBrowserView变化,这些逻辑都在ProxyBrowser
    View中,ProxyBrowserView为里面的一群ProxiedBrowserView提供了对外被操作和操作的接口,类似于一个中间层, 而因为代表 V 的
    BrowserManager也被传入到了此ProxyBrowserView中,因此 ProxyBrowserView可以监视V的变化<ViewPager的PagerAdapter> 和 对 V 进行
    操作<ViewPager显示某个ProxiedBrowserView>。
    这种模式其实说白了就是封装 + 代理模式, 外边的实体 要交互的 对象 只是一个 BrowserView, 至于这个BrowserView当前倒是哪个是什么,不care,因此就有了ProxyBrowserView 代理了 一群被代理 的 ProxiedBrowserView 的 交互。

    <2>TabImpl里面也包含了一堆的proxiedBrowserView<纯粹从UI概念上说,因为用户从一个Tab切换到另外一个Tab,当前Tab的所有Webview都会被从ViewPager中remove,重新add 新的Tab的所有HistoryPart里的ProxiedBrowserView>, TabImpl直接和ProxyBrowserView有关联, 在TabImpl内部有一个BrowserViewProxy,里面就有一个ProxyBrowserView的引用,并且还有一个get方法返回里面的ProxyBrowserView引用,如果一个TabImpl里的引用指向的是null,那么会调用browserFragment<TabManager>的createBrowserView()<最后会以BrowserManager作为参数构造一个实例返回>。
    TabImpl是为了做Tab切换而专门加的一个类,而TabImpl还对外开放了一个接口来返回其代表的ProxyBrowserView,这样等于像Tab又封装了一下ProxyBrowerView。 因为BroserFragment本身就是一个TabManager,那么操作的直接实体应该是Tab<内部会维护一个Tab的List>。

    <3>HistoryPart顾名思义是为了使ProxiedBrowserView能够被以Nav History形式组织起来而对ProxiedBrowserView进行的再封装,
    为此,HistoryPart implements了ProxiedBrowserView内部的Delegate接口,意思就是ProxiedBrowserView的一部分逻辑功能被放在History中实现了,所以才是ProxiedBrowserView的Delegate。而HistoryPart中也保存一个指向ProxyBrowserView的引用,已得知当前proxy。
    当然的也会维护一个指向ProxiedBrowserView的引用,并且会把自己作为Delegate设置给ProxiedBrowserView

    <4>HistoryPart之间的切换也是在ProxyBrowserView中提供的,如果当前ProxyBrowserView所属的Tab是active的,就是当前展示给用户的,
    那么会显式的进行ViewPager的setCurrentItem来实现视觉上的从一个HistoryPart的View到另外一个HistoryPart的View的变化,
    而如果当前Tab不是active的,那么就不需要在视觉上进行切换<因为当前该Tab的所有HistoryPart的view都不在该Viewpager中>,之需要将该Tab对应的内存中的信息修改一下,会将此HistoryPart加入到ProxyBrowserView所维护的HistoryPartList中,并且会将其currentHistoryPart设为当前切换到的HistoryPart去, 一个是视觉上的切换,一个是后台数据上的切换。
    展开全文
  • App层的功能主要分几块: 使用WebView的浏览器页面主体 除WebView之外的UI ...BrowserActivity继承自Activity,提供了对Browser应用生命周期的控制,事件的入口。这里的事件包括Key的事件,菜单的...

    App层的功能主要分几块:

    使用WebView的浏览器页面主体

    除WebView之外的UI

    页面的相关功能,如页内查找,前进,后退

    设置

    事件

    多窗口管理

    书签/历史记录

     

    首先看构成主体框架的几个类

    BrowserActivity

    BrowserActivity继承自Activity,提供了对Browser应用生命周期的控制,事件的入口。这里的事件包括Key的事件,菜单的事件等。

    BrowserActivity创建了Controller(用于控制)和UI(用于显示)这两个核心类的对象。

    BrowserActivity中接收到的事件等信息都传递给Controller,由Controller来做具体的处理。这样BrowserActivity其实负责很轻松的工作,就是创建和传递。这里可以把BrowserActivity当做一个外界的信息源来看待,而把UI和Controller的组合当做真正的主体看待。

     

    主界面

    浏览页面的主界面由接口类UI来定义对外的接口,由UI的实现类BaseUI来实现基本的功能,由BaseUI的继承类PhoneUI和XLargeUI来分别实现Phone和Pad的特殊UI界面。

    Controller中有UI的引用,UI定义的接口主要就是提供给Controller,供Controller控制UI。即Controller只能通过UI提供的这些有限的接口来控制主界面。

    这样看主界面的控制并不繁琐,通过UI这个接口把界面的实现和界面的控制给分离开了。

    BaseUI是实现UI接口的类。BaseUI提供了主界面的实现。这里的主界面是指浏览网页的界面,不包含书签,设置等页面。

    PhoneUI和XLargeUI继承自BaseUI。他们对BaseUI的一些功能做了扩展,实际上BaseUI对一些函数做了空实现,由其继承类再做具体的实现。

    BaseUI主要由两部分界面组成,一个是上面的TitleBar,另一个是下面的WebView。这里分别对应了TitleBar类与Tab类。

     

    主界面的控制

    有了UI界面后,需要有相应的控制器来操作UI界面。于是抽象出了主界面的控制器UiController接口。

    其他的地方就可以通过获取UiController的引用,来操作UI了。

    Controller实现了UiController接口,即实现UiController具体功能的就是Controller,其他地方获取的就是Controller的引用。

    BaseUi本身也有UiController的引用,用于自身做一些控制跟UI相关的操作。其实UiController定义的接口并不都是控制UI界面的,而是指跟UI相关的一批功能。

    Controller继承UiController接口,本身有UI接口的引用。

    BaseUI继承UI接口,本身有UiController接口的引用。

     

    WebView的控制

    浏览器的主体是WebView,对网页的操作都是通过WebView这个控件完成的。

    WebView被Tab类给包装起来,并且把BrowserSetting说也包含进来了。BrowserSetting是一个单例类,也即只有一个BrowserSetting对象。但是每一个窗口对应一个Tab。每个Tab里会创建一个WebView,同时包含BrowserSetting的引用。用公共的BrowserSetting的设置内容来配置它自己的WebView。

    对于Tab,有一个TabControl的类来管理它,这里我觉得不称为控制,称为管理更好,因为TabControl与Tab是一对多的关系,TabControl用于创建,销毁Tab,并且管理所有的Tab,排序所有的Tab,让其他模块可以获取某个Tab,至于获取到Tab后,就由相应的模块直接控制该Tab了。

    而TabControl又是在Controller中创建的,由Controller 来维护,但是Controller 也提供了getTabControl()的接口,可以让其他模块获取到TabControl的引用。

     

    对于WebView 的控制操作,又抽象出了WebViewController接口。WebViewController中很多接口函数都是需要传入Tab作为参数的。而实现WebViewController接口的是Controller。

    这就比较容易理解为什么需要传入Tab作为参数了,因为Controller中管理的是TabControl

    的对象,而TabControl是管理一组Tab的。所以如果要明确的对某一个Tab进行相关的操作,则需要通过参数传入该Tab,而Tab中又包含着WebView,所以Controller能够进一步的操作到WebView。

    在Tab中又有WebViewController的引用,这样Tab也可以进一步调用到TabControl,进而与其他的Tab相互控制。

    界面,WebView,控制器

    通过以上可见,Controller即实现了UiController接口,又实现了WebViewController接口。而主页面BaseUI中又有一个当前被激活使用的Tab。BaseUI与Tab都通过Controller来控制。

    这样其他的模块只要获取了Controller的引用,即可控制界面的WebView和其他的界面部分。

      

    WebView的接口的使用

    WebView是伴随着Tab一起创建的,Tab中管理着WebView,但是WebView的create是在Controller中,再设置给Tab,这样Tab可以剥除它的WebView,也可以重新设置WebView。

    但是WebView的接口主要通过Tab来调用。

    Tab中有两个WebView,一个被称为mMainView,另一个为mSubView(暂时不知道何时使用)。另外有一个BrowserSettings用于获额取当前浏览器的设置,并可以通过BrowserSettings来对全局的设置进行操作。

    Tab之间又可以组建父子关系,在一个页面中通过点击一个链接,并且在新的Tab页中打开这个链接时,那么新Tab就是当前这个Tab的孩子。

    WebView的回调是通过WebChromeClient和WebViewClient这两个类作为回调类来实现的。

    Tab中创建这两个类的继承类对象,然后设置在其WebView上。

    这样外部模块通过Tab封装的WebView接口可以调用WebView的功能,或者通过Tab获取WebView,直接操作WebView来调用WebView的功能。

    WebView通过回调类来回调一些操作,这些操作通过Tab实现的回调类来把回调信息传递到外部。注意Tab是可以获取到WebViewController的,而WebViewController与UiController是同一个Controller。即UI跟WebView是通过Controller连接起来的。所以在Tab中获取到回调信息后,是可以进一步通过Controller传递出去的。

    UI请求WebView功能与WebView功能回调UI

    基于上诉的框架可以看以下的一个例子,看下loadUrl这个操作。

    当在地址栏输入一个url时并点击回车时,会触发loadUrl这个流程。

    首先看界面上,地址栏是属于TitleBar的。在layout中可以看到title_bar_nav.xml文件定义了布局。而地址栏就对应了类UrlInputView。所以事件会从这里开始触发。

    这个地址栏UI布局的从外到内整体情况如下:

    BaseUi->TitleBar->NavigationBarBase->UrlInputView

    在对事件从内向往的处理过程中,就可以通过BaseUi找到UiController了(实际代码中在创建一些UI相关的类对象时就会把UiController传给该UI类对象,以便于以后使用。但是UiController最初是在BaseUi中获取到的)。

    再根据前面所述的框架,UI找到了UiController(即Controller),然后调用UiController的处理方法,UiController的处理时,此时就不要把它再看做UiController,而是看做Controller,Controller的处理会通过TabControl找到某个具体的Tab,然后再通过Tab找到WebView,进而调用WebView的loadUrl。

    经过上述流程就完成了,然后Controller再调用UI接口提供的执行进度更新的处理,即又完成了Controller对UI的控制。

    通过以上可见,UI部分可以通过找到UiController,进而调用Controller的处理函数。

    Controller本身既包含对UI的处理,又包含对WebView的处理,以及对Tab的管理。

    而Tab也可以通过WebViewController来找到Controller,进而对UI或者其他的Tab进行处理。

    这样很清晰的看到Controller是个总控制,也是个中转。

    上面对WebView执行loadUrl之后,会收到WebView的一些回调信息,这里以onPageStarted为例。

    首先回调传达到WebViewClient的onPageStarted函数中。之前提过,WebViewClient是在Tab中创建的,并且关联到Tab中的WebView中。所以回调信息首先到达Tab中。

    Tab如果想把信息传达到UI中那么就必须先找到Controller。Tab中有WebViewController,WebViewController就是Controller。这样Tab找到了Controller,Controller中有UI接口的对象,那么通过UI接口提供的操作就可以传达到BaseUI中,这样进一步就可以到达具体的UI控件中了比如TitleBar和NavigationBar。

     

    WebView以事件方式的回调

    WebView还有一种方式是以事件的方式回调。WebView本身是继承自View的一个控件,本身又有Activity的上下文信息,这样WebView可以发起一些事件,由BrowserActivity来响应,典型的一个例子是长按网页上的一个链接或者一个图片时,会弹出一个ContentMenu。

    这个过程时WebView发起了performLongClick()请求,该请求会执行ContentMenu的事件调用。

    BrowserActivity中的onCreateContentMenu被调用,BrowserActivity会把事件传递给Controller,由Controller来处理,Controller会根据WebView请求的一些信息来填充ContentMenu的菜单项,同时会设置菜单项的点击事件。然后又通过UI来设置TitleBar的隐藏。

    这个过程其实就是组建了一个ContentMenu,然后又对当前UI做一些处理。也就是事件从WebView发出,BrowserActivity接收响应,响应传递给Controller。Controller做为主控制,则既可以操作UI也可以操作功能,可以填充ContentMenu也可以为每个菜单项设置具体的功能函数。可见在这个过程中Controller做了很多事,负担了组织和管理和分配的工作。

    设置的管理

    每个WebView有一个WebSettings与之对应,但是浏览器作为一个整体,其所有的WebView的设置内容都相同,于是在app层统一出一个BrowserSettings的单例类。

    在BrowserSettings中由一个List管理了所有的WebSettings。这个是WebSettings的管理中心。

    那么WebSettings的来源呢?在创建WebView的时候,会从该WebView中取出它的WebSettings,然后把这个WebSettings加入到BrowserSettings中进行统一管理,并且还会以当前BrowserSettings中的配置情况对这个WebSettings进行同步设置,这样新的WebSettings的设置情况就跟其他的WebSettings一样了,也即新创建的WebView的设置情况与其他的WebView的设置情况统一了。这么看就跟一个新员工入职一样,新员工入职(创建WebView),进行登记(把它的WebSettings加入到BrowserSettings),并且对他进行员工配置和培训(同步它的WebSettings),这样新员工就跟其他同事有了相同的职位属性了(WebSettings配置相同)。

     

    设置的本地存储

    有了上述的设置的管理和同步后,这些设置还需要保存到本地,以便下次启动时同步。根据android的数据保存的方式,该配置采用SharedPreferences的形式来保存,保存的位置就是手机的/data/data/com.android.browser/shared_prefs/com.android.browser_preferences.xml中。

    BrowserSettings可以获取到SharedPreferences,通过SharedPreferences来读取和写入某项设置的配置情况。并且BrowserSettings把自身作为OnSharedPreferenceChangeListener注册给SharedPreferences,这样当SharedPreferences有变化时,BrowserSettings会请求同步所有的WebSettings,这样各个WebSettings始终跟SharedPreferences的配置情况保持一致。

    设置的UI

    设置的UI采用PreferenceActivity的方式,先把设置分组,每组作为一个header,见preference_headers.xml

    每组的页面又以PreferenceFragment的形式展现,各个PreferenceFragment的初始配置从SharedPreferences中对应项取出。

    当用户选择一些配置项的设置时,就会触发前面所说的SharedPreferences的更新事件,对于一些复杂的配置项,则需要在PreferenceFragment中主动的执行SharedPreferences的设置了,这样同样也会触发SharedPreferences的更新事件。

     

    设置的整体结构

    这样,把上述的内容组合起来得到下面的设置的整体结构

     

    展开全文
  • browser.js

    2020-07-30 23:33:32
    前端开发可能会用到的JavaScript脚本,browser.js文件
  • 12.7.4 BROWSER变量 用户可以把环境变量BROWSER设置为想要尝试的浏览器名或命令,从应用外部控制webbrowser模块。所用的值包含一系列浏览器名,各个名字之间用os.pathsep分隔。如果名字中包含%s,这个名字会被解析为...

    12.7.4 BROWSER变量
    用户可以把环境变量BROWSER设置为想要尝试的浏览器名或命令,从应用外部控制webbrowser模块。所用的值包含一系列浏览器名,各个名字之间用os.pathsep分隔。如果名字中包含%s,这个名字会被解析为一个字面量命令,将直接执行,并把%s替换为URL。否则,这个名字会被传递到get(),以便从注册表得到一个控制器对象。

    如果BROWSER中的所有浏览器都不适用,那么webbrowser就会退回为其默认行为。

    12.7.5 命令行接口
    不进可以从Python程序中访问webbrowser模块的所有特性,也可以通过命令行得到。
    在这里插入图片描述

    展开全文
  • Browser

    2018-01-26 19:41:41
    Luba is surfing the Internet. She currently has n opened tabs in her browser, indexed from 1 to n from left to right. The mouse cursor is currently located at the pos-th tab. Luba needs to use the tab

    Luba is surfing the Internet. She currently has n opened tabs in her browser, indexed from 1 to n from left to right. The mouse cursor is currently located at the pos-th tab. Luba needs to use the tabs with indices from l to r (inclusive) for her studies, and she wants to close all the tabs that don’t belong to this segment as fast as possible.

    Each second Luba can either try moving the cursor to the left or to the right (if the cursor is currently at the tab i, then she can move it to the tab max(i - 1, a) or to the tab min(i + 1, b)) or try closing all the tabs to the left or to the right of the cursor (if the cursor is currently at the tab i, she can close all the tabs with indices from segment [a, i - 1] or from segment [i + 1, b]). In the aforementioned expressions a and b denote the minimum and maximum index of an unclosed tab, respectively. For example, if there were 7 tabs initially and tabs 1, 2 and 7 are closed, then a = 3, b = 6.

    What is the minimum number of seconds Luba has to spend in order to leave only the tabs with initial indices from l to r inclusive opened?

    Input
    The only line of input contains four integer numbers n, pos, l, r (1 ≤ n ≤ 100, 1 ≤ pos ≤ n, 1 ≤ l ≤ r ≤ n) — the number of the tabs, the cursor position and the segment which Luba needs to leave opened.

    Output
    Print one integer equal to the minimum number of seconds required to close all the tabs outside the segment [l, r].

    Example
    Input
    6 3 2 4
    Output
    5
    Input
    6 3 1 3
    Output
    1
    Input
    5 2 1 5
    Output
    0
    Note
    In the first test Luba can do the following operations: shift the mouse cursor to the tab 2, close all the tabs to the left of it, shift the mouse cursor to the tab 3, then to the tab 4, and then close all the tabs to the right of it.

    In the second test she only needs to close all the tabs to the right of the current position of the cursor.

    In the third test Luba doesn’t need to do anything.

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main(){
        int n,pos,l,r;
        cin>>n>>pos>>l>>r;
        ///全部打开,不需要关闭 
        if(l==1&&r==n) cout<<0<<endl;
        ///打开区间在一边 
        else if(l==1||r==n){
            if(l==1) cout<<abs(pos-r)+1<<endl;
            else cout<<abs(pos-l)+1<<endl;
        }
        else cout<<r-l+2+min(abs(pos-l),abs(pos-r))<<endl; 
        return 0;
    }

    题意!!!英语!!!题简单,题意难懂(总感觉有歧义)

    展开全文
  • VSCode插件View InBrowser,在浏览器中查看 当前插件功能类似Atom中的“Run-In-Browser”. 插件功能描述:从浏览器中查看html文件,使用系统的当前默认浏览器 注:只支持html文件 默认的快捷键Ctrl+F1,可以自定义...
  • File Browser作为一款远程文件管理器,只需要我们的客户端与服务的网络的畅通,我们就可以把自己闲置的云服务器作为自己的私人网盘,充分利用自己在阿里云购买的服务器。 File Browser 介绍 File Browser作为一款远...
  • VScode中open in browser 和 view in browser默认浏览器配置 VScode是我们常用的编辑器,但是对于小白来说,安装好一个VScode还是要走好多弯路的,下面我们介绍一下关于VScode的两个插件open in browser 和 view in ...
  • Browser Driver一般是一个EXE(可执行)程序,或者浏览器的扩展程序,它使用HTTP Server持续监听Selenium2 Commands,其功能主要有: 从客户端(执行自动化脚本的计算机)接收HTTP Request 确定Selenium Commands...
  • FileBrowser文件浏览器部署 概述 FileBrowser 文件浏览器,又名ES文件浏览器,是一个能管理手机本地、局域网共享、FTP和蓝牙文件的管理器。 官网 官网https://filebrowser.github.io/ 官网安装文档 ...
  • ireasoning mib browser是一个非常好用的mib浏览器。 问题是,它的试用期只有一个月,一个月内所有功能都是开放的。 一个月后就不能使用了。 即使卸载了这个软件重新安装也不行。 难道除了购买就没有其他办法了么?...
  • mib browser打开mib文件

    2019-03-19 21:00:04
    1.如下图,通过mib compiler工具编译.mib格式的文件,点击ok,则会将文件进行编译,编译完成后,如第二张图所示,点击save ...2.打开mib browser工具,将文件全部加在进来,如第三张图所示。 3.查找添加的节点的oi...
  • SWT可交互式Browser控件

    2008-06-23 14:22:00
    在许多平台中,Browser控件皆被作为一个必需的控件给出,并提供了DOM接口,用于访问Browser的内容,相对来说SWT中的Browser控件就比较薄弱,没有提供DOM的可控制接口,那么,如何和控件所加载的页面进行交互呢?...
  • 1. 先把MG-SOFT+MIB+Browser+v10b破解版给下下来,安装。(注意要以管理员身份运行,需要权限的)安装到有LICENSE.KEY的文件夹下,也就是安装到解压出来的文件夹(反正我是这样安装的,别的地方安装失败了) 2....
  • 首先,切换到DB Browser视图。 然后,在在如图黑色三角处右键,new,出现如下配置界面。 以配置MySQL为例,参数配置界面填充数据如图: 点击Test Driver按钮,弹出一个输入密码提示框,输入正确的数据库密码后,...
  • 一般拿到html用VScode打开就是open in Browser,特别习惯的就ATL+ B了。 但是直接使用open in Browser 打开html文件,它的url将会是它存储在电脑上的物理位置,就相当于你直接对html文件双击打开一样; 这样打开的...
  • 每个引擎或者每个平台都有自己的局限性,unity也不例外,那么这个时候,我们可以导入第三方的一些功能或者插件来实现我们的功能。...首先,导入插件,随便打开一个场景,找个挂载Browser,修改上面的ur...
  • 关于View in Browser

    2011-04-11 10:20:00
    在InterDev中【选择网页】=>【右键】=>【View in Browser】不显示! 想到了在做ASP.Net的程序的时候有一个添加浏览器,并设置某某浏览器为默认浏览器的功能!可能与这个有关系。 果然:【选择网页】...
  • 软件 版本 下载地址 CentOS 7.3 ...filebrowser ...https://github.com/filebrowser/filebrowser ...1、安装filebrowser tar -xvf linux-amd64-filebrowser.tar.gz mkdir -p /filebrowser mv filebrowser /filebrows...
  • 在neo4j browser网页中调试cypher语句时,使用预先定义的变量会更方便且增加代码的可读性,类似于SQL语句中的参数。 参数对当前会话有效,网页刷新变量消失。变量为一个kv的键值对。 定义的语法是 :param a:1, b:...
1 2 3 4 5 ... 20
收藏数 301,127
精华内容 120,450
关键字:

browser