具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明提供的脚本执行方法是指页面进程与独立进程之间的脚本执行方法。其中页面进程运行Web页面的进程,独立进程是独立于页面进程的另一进程。在页面有ActiveX插件的情况下,页面进程运行ActiveX插件代理对象,独立进程运行ActiveX插件活动对象,该ActiveX插件活动对象是真正的ActiveX插件的对象。在以下实施例中,以ActiveX插件为Flash插件为例进行说明,但本发明不仅限于此。
在介绍页面进程和独立进程之间的脚本执行方法之前,首先介绍Flash插件代理对象和Flash插件活动对象的创建过程。图1示出了本发明中Flash插件代理对象和Flash插件活动对象的创建过程的示意图。如图1所示,页面进程中运行有Web页面和Flash插件代理对象,独立进程中运行有空页面和Flash插件活动对象。
其中,运行于页面进程中的Flash代理对象是通过拦截浏览器的页面进程创建Flash活动对象的过程,替换实际要创建的Flash活动对象而创建的。具体来说,在页面中有Flash的情况下,当浏览器创建Flash插件时,会根据Flash插件CLSID(类标识,可通过CLSIDFromProID获得)或ProgID(组件的字符串标识符)查询注册表,查看***是否已安装该Flash插件,若安装则继续创建过程。在页面进程继续创建Flash插件时,拦截CoGetClassObject,创建Flash插件代理对象,该Flash插件代理对象包括一系列接口,包括IUnknown指针将会调用的很多标准接口,例如IOleObject、IViewObject等。然后在调用IClassFactory的CreateInstance时,将所创建的Flash插件代理对象返回给页面进程的IUnknown指针。由此Flash插件代理对象创建完成。
运行于独立进程中的Flash插件活动对象是在页面进程激活Flash插件代理对象时,在独立于页面进程的独立进程中创建的。具体来说,在页面进程激活Flash插件代理对象时,提取出该Flash插件的属性、URL、大小等相关信息,然后创建一个独立进程。首先,创建一个文件(document),即空页面,在其中***一个对象(object),该独立进程调用CoGetClassObject,拦截该CoGetClassObject,创建一个Flash插件活动对象。该Flash插件活动对象包括一系列的接口,包括IUnknown指针将会调用的很多标准接口,例如IOleObject、IViewObject等。然后在调用IClassFactory的CreateInstance时,将所创建的Flash插件活动对象返回给独立进程的IUnknown指针。由此Flash插件活动对象创建完成。
接着,在Flash插件代理对象和Flash插件活动对象中分别创建与插件对象关联的通信窗口,用于使Flash插件代理对象和Flash插件活动对象进行通信。通过这两个通信窗口,两个对象可以针对Flash的大小、焦点、刷新、脚本以及其它信息进行交互。
进一步的,如果Web页面中有嵌套结构,即页面进程运行有多个父页面和多个子页面。每当页面进程创建一个子页面及其代理对象时,将子页面的代理对象ID(也可包括其URL)和该子页面的父页面的代理对象ID(也可包括其URL)发送给独立进程,在独立进程中按照对应的层次结构创建活动对象。在这种情况下,运行于页面进程中的代理对象为多个,运行于独立进程中的活动对象为多个,代理对象和活动对象一一对应,每个代理对象的通信窗口和与该代理对象对应的活动对象的通信窗口具有对应的属性,通过这两个通信窗口实现活动对象和与其对应的代理对象的通信。
图2示出了根据本发明一个实施例的脚本执行方法200的流程图。该方法适用于由运行于页面进程中的Flash插件代理对象执行运行于独立进程中的Flash插件活动对象的脚本,即该方法是运行于独立进程中的Flash插件活动对象控制页面进程中页面的方法。如图2所示,方法200始于步骤S201,其中Flash插件活动对象通过通信窗口将脚本发送给Flash插件代理对象。以用户点击Flash上创建的按钮,触发页面变黑为例,当用户点击Flash上的按钮时,Flash插件活动对象获取按钮点击操作对应的脚本,将该脚本通过通信窗口发送给Flash插件代理对象。
随后,方法200进入步骤S202,其中Flash插件代理对象查询页面进程中与脚本执行有关的接口,根据该接口获取脚本执行方法。在Flash插件代理对象接收到上述按钮点击操作对应的脚本之后,查询和获取页面进程中的IHTMLWindow接口,IHTMLWindow接口为与脚本执行有关的接口,该IHTMLWindow接口中的ExecScript为用于执行脚本的函数,即ExecScript函数提供脚本执行方法。
随后,方法200进入步骤S203,其中Flash插件代理对象根据脚本执行方法执行该脚本。Flash插件代理对象根据ExecScript函数提供的脚本执行方法执行上述按钮点击操作对应的脚本,使页面变黑。
根据本实施例提供的脚本执行方法,在活动对象将脚本发送给代理对象之后,代理对象查询页面进程中与脚本执行有关的接口,根据该接口获取脚本执行的方法,进而根据脚本执行的方法执行活动对象发送过来的脚本,由此实现了不同进程之间脚本的执行,并且实现了运行于独立进程中的活动对象对运行于页面进程中的页面的控制。进一步的,在本方法中,通过在页面进程中运行代理对象,而在独立进程中运行活动对象,使得真正的ActiveX插件与页面进程分离,从而使ActiveX插件出现问题时不会影响页面进程,提高了浏览器的稳定性,尤其是当ActiveX插件出现病毒等安全性问题时,也不会对页面进程产生影响,提高了浏览器的安全性;同时,页面进程出现问题不会影响ActiveX插件的正常运行,提高了插件的稳定性。
图3示出了根据本发明另一个实施例的脚本执行方法300的流程图。该方法适用于由运行于独立进程中的Flash插件活动对象执行运行于页面进程中的Flash插件代理对象的脚本,即该方法是运行于页面进程中的页面控制独立进程中Flash插件活动对象的方法。如果页面想要获取Flash的信息(如版本号、路径、URL等属性)或者页面想要操作Flash(如页面想要改变Flash窗口的大小),都可以通过该方法来实现。
如图3所示,方法300始于步骤S301,Flash插件代理对象通过通信窗口将脚本发送给Flash插件活动对象。以获取Flash版本号为例,由于页面进程中的Flash插件代理对象并不是真正的Flash插件,它并不知道Flash版本号,因而Flash插件代理对象不能直接向页面反馈Flash版本号。在独立进程创建完成Flash插件活动对象之后,会向页面通知Flash插件活动对象的变量,页面开发者根据该变量在页面中写入获取Flash版本号的脚本,该脚本中待执行的方法就是获取Flash版本号。Flash插件代理对象通过通信窗口将获取Flash版本号的脚本发送给Flash插件活动对象。
随后,方法300进入步骤S302,其中Flash插件代理对象通过调用Flash插件活动对象的调度接口,让Flash插件活动对象执行获取脚本中待执行方法的调度标识的方法,在Flash插件活动对象获取该调度标识后通过通信窗口将调度标识返回给Flash插件代理对象。具体来说,首先页面解析脚本,将该脚本中待执行的方法的名称调到Flash插件代理对象的IDispatch接口中,IDispatch接口为调度接口,用于调用不支持虚函数表的语言程序中的函数,IDispatch接口具有GetIDsOfNames函数和Invoke函数,其中GetIDsOfNames函数提供的是利用方法的名称返回其调度ID的方法,Invoke函数提供的是利用方法的调度ID执行方法的指令。由于Flash插件代理对象无法获知脚本中待执行方法的调度标识(ID),所以Flash插件代理对象通过通信窗口调用Flash插件活动对象的IDispatch接口。而Flash插件活动对象是真正的Flash插件的对象,所以通过调用Flash插件活动对象的GetIDsOfNames函数提供的方法,可以让Flash插件活动对象获取待执行的方法的调度ID,然后Flash插件活动对象通过通信窗口将该调度ID返回给Flash插件代理对象。
随后,方法300进入步骤S303,其中Flash插件代理对象拦截页面进程中执行脚本中待执行方法的指令,将该指令发送给Flash插件活动对象。具体来说,在Flash插件代理对象获得待执行的方法的调度ID之后,将该调度ID反馈给页面,按照常规流程页面进程下一步就会执行Invoke(ID)的指令,本方法在这里拦截页面进程的Invoke(ID)的指令,将Invoke(ID)的指令发送给Flash插件活动对象。
随后,方法300进入步骤S304,其中Flash插件活动对象通过执行指令,执行脚本中待执行方法,而后将执行结果返回给Flash插件代理对象。具体来说,Flash插件活动对象执行Invoke(ID)的指令,从而执行脚本中待执行的方法,获取Flash版本号,并将Flash版本号返回给Flash插件代理对象,然后Flash插件代理对象会将Flash版本号反馈给页面。
根据本实施例提供的脚本执行方法,在代理对象将脚本发送给活动对象之后,代理对象调用活动对象的调度接口获取脚本中待执行方法的调度ID;在代理对象将调度ID反馈给页面后,代理对象拦截页面进程执行脚本中待执行方法的指令,将指令发送给活动对象,由活动对象执行该指令,并将执行指令后获得的执行结果返回给代理对象,由此实现了不同进程之间脚本的执行,并且实现了运行于页面进程中的页面对运行于独立进程中的活动对象的控制。进一步的,在本方法中,通过在页面进程中运行代理对象,而在独立进程中运行活动对象,使得真正的ActiveX插件与页面进程分离,从而使ActiveX插件出现问题时不会影响页面进程,提高了浏览器的稳定性,尤其是当ActiveX插件出现病毒等安全性问题时,也不会对页面进程产生影响,提高了浏览器的安全性;同时,页面进程出现问题不会影响ActiveX插件的正常运行,提高了插件的稳定性。
图4示出了根据本发明一个实施例的脚本执行***的结构框图。如图4所示,该***包括:运行于页面进程中的代理对象410、运行于独立进程中的活动对象420以及分别在代理对象410和活动对象420中创建的一对通信窗口430。该***适用于由代理对象410执行活动对象420的脚本,代理对象410和活动对象420通过一对通信窗口430进行通信。
活动对象420包括发送模块421,适于通过通信窗口430将脚本发送给代理对象410。以用户点击Flash上创建的按钮,触发页面变黑为例,当用户点击Flash上的按钮时,活动对象420获取按钮点击操作对应的脚本,由发送模块421将该脚本通过通信窗口430发送给代理对象410。
代理对象410包括:查询模块411和执行模块412。查询模块411适于查询页面进程中与脚本执行有关的接口,根据该接口获取脚本执行方法;执行模块412适于根据脚本执行方法执行脚本。在代理对象410接收到上述按钮点击操作对应的脚本之后,查询模块411查询和获取页面进程中的IHTMLWindow接口,IHTMLWindow接口为与脚本执行有关的接口,该IHTMLWindow接口中的ExecScript为用于执行脚本的函数,即ExecScript函数提供脚本执行方法。执行模块412根据ExecScript函数提供的脚本执行方法执行上述按钮点击操作对应的脚本,使页面变黑。
上述运行于页面进程中的代理对象410是通过拦截浏览器的页面进程创建活动对象的过程,替换实际要创建的活动对象而创建的;运行于独立进程中的活动对象420是在页面进程激活代理对象410时,在独立于页面进程的独立进程中创建的;在活动对象420和代理对象410中分别创建的一对通信窗口430用于使活动对象420和代理对象410进行通信。
进一步的,运行于页面进程中的代理对象为多个,运行于独立进程中的活动对象为多个,代理对象和活动对象一一对应,代理对象的通信窗口和与代理对象对应的活动对象的通信窗口具有对应的属性,通过该一对通信窗口实现活动对象和代理对象的通信。
根据本实施例提供的脚本执行***,在活动对象将脚本发送给代理对象之后,代理对象查询页面进程中与脚本执行有关的接口,根据该接口获取脚本执行的方法,进而根据脚本执行的方法执行活动对象发送过来的脚本,由此实现了不同进程之间脚本的执行,并且实现了运行于独立进程中的活动对象对运行于页面进程中的页面的控制。进一步的,在本***中,通过在页面进程中运行代理对象,而在独立进程中运行活动对象,使得真正的ActiveX插件与页面进程分离,从而使ActiveX插件出现问题时不会影响页面进程,提高了浏览器的稳定性,尤其是当ActiveX插件出现病毒等安全性问题时,也不会对页面进程产生影响,提高了浏览器的安全性;同时,页面进程出现问题不会影响ActiveX插件的正常运行,提高了插件的稳定性。
图5示出了根据本发明另一个实施例的脚本执行***的结构框图。如图5所示,该***包括:运行于页面进程中的代理对象510、运行于独立进程中的活动对象520以及分别在代理对象510和活动对象520中创建的一对通信窗口530。该***适用于由活动对象520执行页面进程中的脚本,代理对象510和活动对象520通过一对通信窗口530进行通信。
代理对象510包括:发送模块511、调度标识获取模块512以及拦截模块513。
发送模块511适于通过通信窗口将脚本发送给活动对象520;在独立进程创建完成活动对象520之后,会向页面通知活动对象520的变量,页面开发者根据该变量在页面中写入脚本,发送模块511通过通信窗口530将脚本发送给活动对象520。
调度标识获取模块512适于通过调用活动对象520的调度接口,获取脚本中待执行方法的调度标识。进一步的,调度标识获取模块512包括调用模块514和调度标识接收模块515,调用模块514适于调用活动对象520的调度接口,让活动对象520执行获取脚本中待执行方法的调度标识的方法获取调度标识;调度标识接收模块515适于接收活动对象520通过通信窗口530返回的调度标识。具体来说,首先页面解析脚本,将该脚本中待执行的方法的名称调到代理对象510的IDispatch接口中,IDispatch接口为调度接口,用于调用不支持虚函数表的语言程序中的函数,IDispatch接口具有GetIDsOfNames函数和Invoke函数,其中GetIDsOfNames函数提供的是利用方法的名称返回其调度ID的方法,Invoke函数提供的是利用方法的调度ID执行方法的指令。由于代理对象510无法获知脚本中待执行方法的调度ID,所以调用模块514通过通信窗口530调用活动对象520的IDispatch接口。而活动对象520是真正的插件的对象,所以通过调用活动对象520的GetIDsOfNames函数提供的方法,可以让活动对象520获取待执行的方法的调度ID,然后活动对象520通过通信窗口530将该调度ID返回给调度标识接收模块515。
拦截模块513适于拦截页面进程中执行脚本中待执行方法的指令,将指令发送给活动对象520。在代理对象510获得待执行的方法的调度ID之后,将该调度ID反馈给页面,按照常规流程页面进程下一步就会执行Invoke(ID)的指令,在这里拦截模块513拦截页面进程的Invoke(ID)的指令,将Invoke(ID)的指令发送给活动对象520。
活动对象520包括:接收模块521和执行模块522。接收模块521适于接收代理对象510中的发送模块511发送的脚本以及拦截模块513发送的指令;执行模块522适于通过执行指令,执行脚本中待执行方法,而后将执行结果返回给代理对象510。执行模块522执行Invoke(ID)的指令,从而执行脚本中待执行的方法,并将执行结果返回给代理对象510,然后代理对象510会将执行结果反馈给页面。
上述运行于页面进程中的代理对象510是通过拦截浏览器的页面进程创建活动对象的过程,替换实际要创建的活动对象而创建的;运行于独立进程中的活动对象520是在页面进程激活代理对象510时,在独立于页面进程的独立进程中创建的;在活动对象520和代理对象510中分别创建的一对通信窗口530用于使活动对象520和代理对象510进行通信。
进一步的,运行于页面进程中的代理对象为多个,运行于独立进程中的活动对象为多个,代理对象和活动对象一一对应,代理对象的通信窗口和与代理对象对应的活动对象的通信窗口具有对应的属性,通过该一对通信窗口实现活动对象和代理对象的通信。
根据本实施例提供的脚本执行***,在代理对象将脚本发送给活动对象之后,代理对象调用活动对象的调度接口获取脚本中待执行方法的调度ID;在代理对象将调度ID反馈给页面后,代理对象拦截页面进程执行脚本中待执行方法的指令,将指令发送给活动对象,由活动对象执行该指令,并将执行指令后获得的执行结果返回给代理对象,由此实现了不同进程之间脚本的执行,并且实现了运行于页面进程中的页面对运行于独立进程中的活动对象的控制。进一步的,在本***中,通过在页面进程中运行代理对象,而在独立进程中运行活动对象,使得真正的ActiveX插件与页面进程分离,从而使ActiveX插件出现问题时不会影响页面进程,提高了浏览器的稳定性,尤其是当ActiveX插件出现病毒等安全性问题时,也不会对页面进程产生影响,提高了浏览器的安全性;同时,页面进程出现问题不会影响ActiveX插件的正常运行,提高了插件的稳定性。
本发明还提供了一种浏览器,该浏览器可以包括上述实施例所描述的任一脚本执行***。
在此提供的算法和显示不与任何特定计算机、虚拟***或者其它设备固有相关。各种通用***也可以与基于在此的示教一起使用。根据上面的描述,构造这类***所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的脚本执行***及浏览器中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。