vchrome 0.0.4__py3-none-any.whl → 0.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
vchrome/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = '0.0.4'
1
+ __version__ = '0.0.6'
2
2
  __author__ = 'v'
3
3
  # ----------------------------------------------------------------------------------------------------
4
4
  _allowed = {'Chrome'}
@@ -72,7 +72,7 @@ def cdp_client(hostname, port, debug=False):
72
72
  self.indent = 44
73
73
  if self.debug:
74
74
  monkey_print()
75
- def log(*a):
75
+ def log(self, *a):
76
76
  print(*a)
77
77
  def __call__(self, tp, a):
78
78
  if self.debug:
@@ -85,20 +85,20 @@ def cdp_client(hostname, port, debug=False):
85
85
  cse = c.get('sessionId')
86
86
  cmd = c.get('method')
87
87
  if self.debug(cmd):
88
- print(self._T('c', cse), '[<={:3}] {}'.format(id, cmd).ljust(self.indent, ' '), self._L(a, 'result'))
88
+ self.log(self._T('c', cse), '[<={:3}] {}'.format(id, cmd).ljust(self.indent, ' '), self._L(a, 'result'))
89
89
  if md:
90
90
  if self.debug(md):
91
- print(self._T('i', se), (' '*8 + md).ljust(self.indent, ' '), self._L(a, 'params'))
91
+ self.log(self._T('i', se), (' '*8 + md).ljust(self.indent, ' '), self._L(a, 'params'))
92
92
  elif tp == 'req':
93
93
  id = a.get('id')
94
94
  md = a.get('method')
95
95
  se = a.get('sessionId')
96
96
  if self.debug(md):
97
97
  self._C(id, a)
98
- print(self._T('c', se), '[->{:3}] {}'.format(id, md).ljust(self.indent, ' '), self._L(a, 'params'))
98
+ self.log(self._T('c', se), '[->{:3}] {}'.format(id, md).ljust(self.indent, ' '), self._L(a, 'params'))
99
99
  else:
100
100
  if self.debug.rest:
101
- print(self._T('i'), (' '*8 + tp).ljust(self.indent, ' '), a)
101
+ self.log(self._T('i'), (' '*8 + tp).ljust(self.indent, ' '), a)
102
102
  class Pool:
103
103
  import queue, time, traceback
104
104
  from threading import Thread, main_thread
@@ -807,22 +807,25 @@ def cdp_client(hostname, port, debug=False):
807
807
  if self.f.root.filter_extension(tinfo):
808
808
  self.f.root._del_init_check()
809
809
  return
810
+ # TODO
811
+ # need to be compatible with service_worker in the future
810
812
  if rdata['params'].get('targetInfo', {}).get('type') == 'service_worker':
811
813
  self.f.root._del_init_check()
812
814
  return
813
- # TODO
814
- # need to be compatible with workers in the future
815
815
  if rdata['params'].get('targetInfo', {}).get('type') == 'worker':
816
- # and rdata['params'].get('targetInfo', {}).get('title', '').startswith('blob'):
816
+ sessionId = rdata['params']['sessionId']
817
+ self.f.cdp('Runtime.enable', sessionId=sessionId)
818
+ self.f._work_init_js(sessionId=sessionId)
819
+ self.f.cdp('Runtime.runIfWaitingForDebugger', sessionId=sessionId)
817
820
  self.f.root._del_init_check()
818
821
  return
819
822
  frameId = tinfo['targetId']
820
823
  sessionId = rdata['params']['sessionId']
821
- # self.f.cdp("Target.setAutoAttach", {
822
- # "autoAttach": True,
823
- # "waitForDebuggerOnStart": True,
824
- # "flatten": True,
825
- # }, sessionId=sessionId)
824
+ self.f.cdp("Target.setAutoAttach", {
825
+ "autoAttach": True,
826
+ "waitForDebuggerOnStart": True,
827
+ "flatten": True,
828
+ }, sessionId=sessionId)
826
829
  self.f.cdp('DOM.enable', sessionId=sessionId)
827
830
  self.f.cdp('Page.enable', sessionId=sessionId)
828
831
  self.f.cdp('Runtime.enable', sessionId=sessionId)
@@ -846,7 +849,7 @@ def cdp_client(hostname, port, debug=False):
846
849
  self.f.root._del_init_check()
847
850
  def Target_detachedFromTarget(self, rdata):
848
851
  sessionId = rdata['params']['sessionId']
849
- pass
852
+ self.f.root.detached_cache_sessionId[sessionId] = perf_counter()
850
853
  def Target_targetCreated(self, rdata):
851
854
  pass
852
855
  def Target_targetInfoChanged(self, rdata):
@@ -1689,7 +1692,8 @@ def cdp_client(hostname, port, debug=False):
1689
1692
  # "positionY": 200,
1690
1693
  # }, sessionId=sessionId)
1691
1694
  class CoreCDP:
1692
- def __init__(self, ws, root, logger=None):
1695
+ def __init__(self, f, ws, root, logger=None):
1696
+ self.f = f
1693
1697
  self.ws = ws
1694
1698
  self.root = root
1695
1699
  self.logger = logger or (lambda *a,**kw:None)
@@ -1698,6 +1702,7 @@ def cdp_client(hostname, port, debug=False):
1698
1702
  self.qret = {}
1699
1703
  self.irun = {}
1700
1704
  self._start()
1705
+ self._cache_del = []
1701
1706
  def _start(self):
1702
1707
  self.is_running = True
1703
1708
  self.loop_recv = Thread(target=self.start_loop)
@@ -1764,6 +1769,13 @@ def cdp_client(hostname, port, debug=False):
1764
1769
  def get_xid(self):
1765
1770
  self.xid += 1
1766
1771
  return self.xid
1772
+ def check_del_cache(self):
1773
+ if self._cache_del:
1774
+ _rid, _tid, cache_obj = self._cache_del[-1]
1775
+ if perf_counter() - _rid > 30:
1776
+ self._cache_del.pop()
1777
+ if _tid in cache_obj:
1778
+ del cache_obj[_tid]
1767
1779
  def cdp(self, protocal, data={}, sessionId=None, no_wait=False, limit_time=None):
1768
1780
  rid = self.get_id()
1769
1781
  cmd = { "id": rid, "method": protocal, "params": data }
@@ -1792,6 +1804,21 @@ def cdp_client(hostname, port, debug=False):
1792
1804
  if perf_counter() - start > limit_time:
1793
1805
  self.qret.pop(rid, None)
1794
1806
  return {'vvv': 'over time'}
1807
+ if sessionId:
1808
+ _tid = sessionId
1809
+ _rid = self.root.detached_cache_sessionId.get(_tid, None)
1810
+ if _rid:
1811
+ self._cache_del.append([_rid, _tid, self.root.detached_cache_sessionId])
1812
+ self.qret.pop(rid, None)
1813
+ return {'vvv': 'detached sessionId'}
1814
+ else:
1815
+ _tid = getattr(self.f, 'frameId', None)
1816
+ _rid = self.root.detached_cache_targetId.get(_tid, None)
1817
+ if _rid:
1818
+ self._cache_del.append([_rid, _tid, self.root.detached_cache_targetId])
1819
+ self.qret.pop(rid, None)
1820
+ return {'vvv': 'detached targetId'}
1821
+ self.check_del_cache()
1795
1822
  ret = self.qret[rid].get(timeout=.15)
1796
1823
  self.qret.pop(rid, None)
1797
1824
  return try_run_result(ret)
@@ -1934,6 +1961,7 @@ def cdp_client(hostname, port, debug=False):
1934
1961
  self.type = wsinfo['type']
1935
1962
  self.frames = []
1936
1963
  self._doc_script = []
1964
+ self._wok_script = []
1937
1965
  self.url = wsinfo.get('url')
1938
1966
  self.parent = None
1939
1967
  self.init_once = False
@@ -1942,7 +1970,7 @@ def cdp_client(hostname, port, debug=False):
1942
1970
  self.sessionId = None # Used to maintain consistency with CDPTools objects
1943
1971
  self.contextId = None # Used to maintain consistency with CDPTools objects
1944
1972
  self.iso_contextId = None # Used to maintain consistency with CDPTools objects
1945
- self.cdper = CoreCDP(self.ws, self.root, self.logger)
1973
+ self.cdper = CoreCDP(self, self.ws, self.root, self.logger)
1946
1974
  self.cdper.attach(self)
1947
1975
  if is_auto_create: self._run_init_once()
1948
1976
  self.root.add_root_frame(self)
@@ -2043,12 +2071,21 @@ def cdp_client(hostname, port, debug=False):
2043
2071
  break
2044
2072
  f = self.cdp("Page.getFrameTree")
2045
2073
  self.url = f['frameTree']['frame']['url']
2046
- def init_js(self, script):
2047
- self._doc_script.append(script)
2074
+ def init_js(self, script, type='page'):
2075
+ if type == 'page':
2076
+ self._doc_script.append(script)
2077
+ elif type == 'worker':
2078
+ self._wok_script.append(script)
2079
+ else:
2080
+ raise Exception('type must in (page/worker) default is page.')
2048
2081
  def _page_init_js(self, sessionId=None):
2049
2082
  if self._doc_script:
2050
2083
  for s in self._doc_script:
2051
2084
  self.cdp('Page.addScriptToEvaluateOnNewDocument', {"source": s}, sessionId=sessionId)
2085
+ def _work_init_js(self, sessionId=None):
2086
+ if self._wok_script:
2087
+ for s in self._wok_script:
2088
+ self.cdp('Runtime.evaluate', {"expression": s}, sessionId=sessionId)
2052
2089
  def tree_view(self):
2053
2090
  r = ''
2054
2091
  def print_tree(f, level=0, prefix=''):
@@ -2072,7 +2109,7 @@ def cdp_client(hostname, port, debug=False):
2072
2109
  self.iso_contextId = None # Used to maintain consistency with CDPTools objects
2073
2110
  self.ws = create_connection_saf(wsinfo['webSocketDebuggerUrl'], enable_multithread=True, suppress_origin=True)
2074
2111
  self.logger = Logger(wsinfo['id'], debug)
2075
- self.cdper = CoreCDP(self.ws, self.root, self.logger)
2112
+ self.cdper = CoreCDP(self, self.ws, self.root, self.logger)
2076
2113
  self.cdper.attach(self)
2077
2114
  self.cdp('Runtime.enable')
2078
2115
  self.tools = CDPTools(self, self)
@@ -2124,10 +2161,11 @@ def cdp_client(hostname, port, debug=False):
2124
2161
  class Root:
2125
2162
  def __init__(self, verison, iframes):
2126
2163
  self.pool = Pool(10)
2127
- self.id = 0
2128
2164
  self.verison = verison
2129
2165
  self.iframes = iframes
2130
2166
  self.active = None
2167
+ self.detached_cache_sessionId = {}
2168
+ self.detached_cache_targetId = {}
2131
2169
  self.new_tab_frame = {}
2132
2170
  self.create_tab_must_be_single = queue.Queue(1)
2133
2171
  self.tabs = []
@@ -2135,7 +2173,7 @@ def cdp_client(hostname, port, debug=False):
2135
2173
  self.init_sign = 0
2136
2174
  self.ws = create_connection_saf(verison['webSocketDebuggerUrl'], enable_multithread=True, suppress_origin=True)
2137
2175
  self.logger = Logger('[[ ---------- ROOT ---------- ]]', debug)
2138
- self.cdper = CoreCDP(self.ws, self, self.logger)
2176
+ self.cdper = CoreCDP(self, self.ws, self, self.logger)
2139
2177
  self.cdper.attach(self)
2140
2178
  self.extension = ExtensionManager(self)
2141
2179
  self.extension.set_extension(self._get_extension())
@@ -2145,6 +2183,7 @@ def cdp_client(hostname, port, debug=False):
2145
2183
  "flatten": True,
2146
2184
  })
2147
2185
  self.set_method_callback('Target.attachedToTarget', self.Target_attachedToTarget)
2186
+ self.set_method_callback('Target.detachedFromTarget', self.Target_detachedFromTarget)
2148
2187
  # self.cdp("Target.setDiscoverTargets", { "discover": True })
2149
2188
  def filter_extension(self, tinfo):
2150
2189
  return tinfo['url'].startswith('chrome-extension://') and tinfo['url'].endswith('/vvv.js')
@@ -2176,6 +2215,9 @@ def cdp_client(hostname, port, debug=False):
2176
2215
  'type': tinfo['type'],
2177
2216
  'url': tinfo['url'],
2178
2217
  }, self)
2218
+ def Target_detachedFromTarget(self, rdata):
2219
+ targetId = rdata['params']['targetId']
2220
+ self.detached_cache_targetId[targetId] = perf_counter()
2179
2221
  def Target_attachedToTarget(self, rdata):
2180
2222
  params = rdata['params']
2181
2223
  sessionId = params.get('sessionId')
@@ -2207,9 +2249,6 @@ def cdp_client(hostname, port, debug=False):
2207
2249
  def _del_init_check(self):
2208
2250
  if self.is_init:
2209
2251
  self.init_sign -= 1
2210
- def get_new_id(self):
2211
- self.id += 1
2212
- return self.id
2213
2252
  def add_root_frame(self, f):
2214
2253
  if not self.active and f.type == 'page':
2215
2254
  self.active = f
@@ -1,3 +1,3 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vchrome
3
- Version: 0.0.4
3
+ Version: 0.0.6
@@ -0,0 +1,5 @@
1
+ vchrome/__init__.py,sha256=LehDiIhsxdw_sRHslCqcrW21btiPNSXsN65u4uJdwjQ,208869
2
+ vchrome-0.0.6.dist-info/METADATA,sha256=ubvdFQ7Lj9XQPSrQkvQz7PR18_vXebRpkS9IHl__0iU,54
3
+ vchrome-0.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
4
+ vchrome-0.0.6.dist-info/top_level.txt,sha256=oB919Fa09PCy48Ptj8iy-1QUcvhEeY97MOR42281Fk0,8
5
+ vchrome-0.0.6.dist-info/RECORD,,
@@ -1,5 +0,0 @@
1
- vchrome/__init__.py,sha256=jr8vqeslue8Qsks_Q8u8Hil5EGfJv9ZwTozKgWbF1A8,206643
2
- vchrome-0.0.4.dist-info/METADATA,sha256=naCPRYBSrjbxNhwRaaccILJPsCYF5Re_Yh6mGtJnAfI,54
3
- vchrome-0.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
4
- vchrome-0.0.4.dist-info/top_level.txt,sha256=oB919Fa09PCy48Ptj8iy-1QUcvhEeY97MOR42281Fk0,8
5
- vchrome-0.0.4.dist-info/RECORD,,