Every web page gets its own network access manager.

Network-related activites should not be shared between web page
instances. Otherwise, it is extremely confusing when there are two (or
more) web pages are active at the same time.

http://code.google.com/p/phantomjs/issues/detail?id=190
1.3
IceArmy 2011-09-15 16:13:57 -07:00
parent 3eb16093c0
commit 0f6c59cc6e
2 changed files with 11 additions and 14 deletions

View File

@ -29,7 +29,6 @@ from __init__ import __version_info__
from utils import injectJsInFrame, QPyFile
from plugincontroller import do_action
from webpage import WebPage
from networkaccessmanager import NetworkAccessManager
from filesystem import FileSystem
from encoding import Encode
@ -42,10 +41,11 @@ class Phantom(QObject):
self.m_defaultPageSettings = {}
self.m_pages = []
self.m_verbose = args.verbose
self.m_page = WebPage(self)
self.m_page = WebPage(self, args)
self.m_returnValue = 0
self.m_terminated = False
# setup the values from args
self.app_args = args
self.m_scriptFile = args.script
self.m_args = args.script_args
self.m_scriptEncoding = Encode(args.script_encoding, 'utf-8')
@ -61,10 +61,6 @@ class Phantom(QObject):
proxy = QNetworkProxy(QNetworkProxy.HttpProxy, args.proxy[0], int(args.proxy[1]))
QNetworkProxy.setApplicationProxy(proxy)
# Provide WebPage with a non-standard Network Access Manager
self.m_netAccessMan = NetworkAccessManager(self, args)
self.m_page.setNetworkAccessManager(self.m_netAccessMan)
self.m_page.javaScriptConsoleMessageSent.connect(self.printConsoleMessage)
self.m_defaultPageSettings['loadImages'] = args.load_images
@ -112,10 +108,9 @@ class Phantom(QObject):
@pyqtSlot(result=WebPage)
def createWebPage(self):
page = WebPage(self)
page = WebPage(self, self.app_args)
self.m_pages.append(page)
page.applySettings(self.m_defaultPageSettings)
page.setNetworkAccessManager(self.m_netAccessMan)
page.libraryPath = os.path.dirname(os.path.abspath(self.m_scriptFile))
return page

View File

@ -30,6 +30,7 @@ from PyQt4.QtWebKit import QWebSettings, QWebPage
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest
from plugincontroller import do_action
from networkaccessmanager import NetworkAccessManager
from utils import injectJsInFrame
@ -73,7 +74,7 @@ class WebPage(QObject):
resourceReceived = pyqtSignal('QVariantMap')
resourceRequested = pyqtSignal('QVariantMap')
def __init__(self, parent):
def __init__(self, parent, args):
super(WebPage, self).__init__(parent)
self.m_parent = parent
@ -113,6 +114,12 @@ class WebPage(QObject):
# Ensure we have a document.body.
self.m_webPage.mainFrame().setHtml('<html><body></body></html>')
# Custom network access manager to allow traffic monitoring
networkAccessManager = NetworkAccessManager(self, args)
self.m_webPage.setNetworkAccessManager(networkAccessManager)
networkAccessManager.resourceRequested.connect(self.resourceRequested)
networkAccessManager.resourceReceived.connect(self.resourceReceived)
self.m_webPage.setViewportSize(QSize(400, 300))
do_action('WebPageInit')
@ -252,11 +259,6 @@ class WebPage(QObject):
self.m_webPage.mainFrame().print_(p)
return True
def setNetworkAccessManager(self, networkAccessManager):
self.m_webPage.setNetworkAccessManager(networkAccessManager)
networkAccessManager.resourceRequested.connect(self.resourceRequested)
networkAccessManager.resourceReceived.connect(self.resourceReceived)
def stringToPointSize(self, string):
units = (
('mm', 72 / 25.4),