Modified: trunk/Tools/ChangeLog (237562 => 237563)
--- trunk/Tools/ChangeLog 2018-10-29 20:34:35 UTC (rev 237562)
+++ trunk/Tools/ChangeLog 2018-10-29 20:55:33 UTC (rev 237563)
@@ -1,3 +1,50 @@
+2018-10-29 Daniel Bates <[email protected]>
+
+ [llbd-webkit] Add summaries for Document, Frame, and SecurityOrigin
+ https://bugs.webkit.org/show_bug.cgi?id=191033
+
+ Reviewed by Andy Estes.
+
+ For Documents we display its origin, URL, whether it's in the main frame, and its page cache state.
+ We display the same details in the summary for a Frame because its Document tends to be the most
+ interesting aspect of it. For SecurityOrigin we display its origin, domain (affects cookie access),
+ and whether the origin has universal access.
+
+ * lldb/lldb_webkit.py:
+ (__lldb_init_module):
+ Register new summary providers.
+
+ (WebCoreSecurityOrigin_SummaryProvider):
+ (WebCoreFrame_SummaryProvider):
+ (WebCoreDocument_SummaryProvider):
+ Add new summary providers.
+
+ (StdOptionalWrapper):
+ (StdOptionalWrapper.__init__):
+ (StdOptionalWrapper.has_value):
+ (StdOptionalWrapper.value):
+ Convenience data type that provides access to the fields of a std::optional<>.
+
+ (WebCoreSecurityOriginProvider):
+ (WebCoreSecurityOriginProvider.__init__):
+ (WebCoreSecurityOriginProvider.is_unique):
+ (WebCoreSecurityOriginProvider.scheme):
+ (WebCoreSecurityOriginProvider.host):
+ (WebCoreSecurityOriginProvider.port):
+ (WebCoreSecurityOriginProvider.domain):
+ (WebCoreSecurityOriginProvider.has_universal_access):
+ (WebCoreSecurityOriginProvider.to_string):
+ (WebCoreFrameProvider):
+ (WebCoreFrameProvider.__init__):
+ (WebCoreFrameProvider.is_main_frame):
+ (WebCoreFrameProvider.document):
+ (WebCoreDocumentProvider):
+ (WebCoreDocumentProvider.__init__):
+ (WebCoreDocumentProvider.url):
+ (WebCoreDocumentProvider.origin):
+ (WebCoreDocumentProvider.page_cache_state):
+ (WebCoreDocumentProvider.frame):
+
2018-10-29 Chris Dumez <[email protected]>
[PSON] When Safari restores session state after launching, going back and forward does not swap processes
Modified: trunk/Tools/lldb/lldb_webkit.py (237562 => 237563)
--- trunk/Tools/lldb/lldb_webkit.py 2018-10-29 20:34:35 UTC (rev 237562)
+++ trunk/Tools/lldb/lldb_webkit.py 2018-10-29 20:55:33 UTC (rev 237563)
@@ -62,6 +62,10 @@
debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreFloatPoint_SummaryProvider WebCore::FloatPoint')
debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreFloatRect_SummaryProvider WebCore::FloatRect')
+ debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreSecurityOrigin_SummaryProvider WebCore::SecurityOrigin')
+ debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreFrame_SummaryProvider WebCore::Frame')
+ debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreDocument_SummaryProvider WebCore::Document')
+
# synthetic types (see <https://lldb.llvm.org/varformats.html>)
debugger.HandleCommand('type synthetic add -x "^WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider')
debugger.HandleCommand('type synthetic add -x "^WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider')
@@ -189,8 +193,32 @@
return "{ x = %s, y = %s, width = %s, height = %s }" % (provider.get_x(), provider.get_y(), provider.get_width(), provider.get_height())
+def WebCoreSecurityOrigin_SummaryProvider(valobj, dict):
+ provider = WebCoreSecurityOriginProvider(valobj, dict)
+ return '{ %s, domain = %s, hasUniversalAccess = %d }' % (provider.to_string(), provider.domain(), provider.has_universal_access())
+def WebCoreFrame_SummaryProvider(valobj, dict):
+ provider = WebCoreFrameProvider(valobj, dict)
+ document = provider.document()
+ if document:
+ origin = document.origin()
+ url = ""
+ pageCacheState = document.page_cache_state()
+ else:
+ origin = ''
+ url = ''
+ pageCacheState = ''
+ return '{ origin = %s, url = "" isMainFrame = %s, pageCacheState = %s' % (origin, url, provider.is_main_frame(), pageCacheState)
+
+
+def WebCoreDocument_SummaryProvider(valobj, dict):
+ provider = WebCoreDocumentProvider(valobj, dict)
+ frame = provider.frame()
+ in_main_frame = '%d' % frame.is_main_frame() if frame else 'Detached'
+ return '{ origin = %s, url = "" isMainFrame = %s, pageCacheState = %s' % (provider.origin(), provider.url(), in_main_frame, provider.page_cache_state())
+
+
def btjs(debugger, command, result, internal_dict):
'''Prints a stack trace of current thread with _javascript_ frames decoded. Takes optional frame count argument'''
@@ -581,6 +609,94 @@
return WTFStringProvider(self.valobj.GetChildMemberWithName('m_string'), dict).to_string()
+class StdOptionalWrapper:
+ def __init__(self, valobj, internal_dict):
+ self.valobj = valobj
+
+ def has_value(self):
+ return bool(self.valobj.GetChildMemberWithName('init_').GetValueAsUnsigned(0))
+
+ def value(self):
+ return self.valobj.GetChildMemberWithName('storage_').GetChildMemberWithName('value_')
+
+
+class WebCoreSecurityOriginProvider:
+ def __init__(self, valobj, internal_dict):
+ self.valobj = valobj
+ self._data_ptr = self.valobj.GetChildMemberWithName('m_data')
+
+ def is_unique(self):
+ return bool(self.valobj.GetChildMemberWithName('m_isUnique').GetValueAsUnsigned(0))
+
+ def scheme(self):
+ return WTFStringProvider(self._data_ptr.GetChildMemberWithName('protocol'), dict()).to_string()
+
+ def host(self):
+ return WTFStringProvider(self._data_ptr.GetChildMemberWithName('host'), dict()).to_string()
+
+ def port(self):
+ optional_port = StdOptionalWrapper(self._data_ptr.GetChildMemberWithName('port'), dict())
+ if not optional_port.has_value():
+ return None
+ return optional_port.value().GetValueAsUnsigned(0)
+
+ def domain(self):
+ return WTFStringProvider(self.valobj.GetChildMemberWithName('m_domain'), dict()).to_string()
+
+ def has_universal_access(self):
+ return bool(self.valobj.GetChildMemberWithName('m_universalAccess').GetValueAsUnsigned(0))
+
+ def to_string(self):
+ if self.is_unique():
+ return 'Unique'
+ scheme = self.scheme()
+ host = self.host()
+ port = self.port()
+ if not scheme and not host and not port:
+ return ''
+ if scheme == 'file:':
+ return 'file://'
+ result = '{}://{}'.format(scheme, host)
+ if port:
+ result += ':' + port
+ return result
+
+
+class WebCoreFrameProvider:
+ def __init__(self, valobj, internal_dict):
+ self.valobj = valobj
+
+ def is_main_frame(self):
+ return self.valobj.GetAddress().GetFileAddress() == self.valobj.GetChildMemberWithName('m_mainFrame').GetAddress().GetFileAddress()
+
+ def document(self):
+ document_ptr = self.valobj.GetChildMemberWithName('m_doc').GetChildMemberWithName('m_ptr')
+ if not document_ptr or not bool(document_ptr.GetValueAsUnsigned(0)):
+ return None
+ return WebCoreDocumentProvider(document_ptr, dict())
+
+
+class WebCoreDocumentProvider:
+ def __init__(self, valobj, internal_dict):
+ self.valobj = valobj
+
+ def url(self):
+ return WebCoreURLProvider(self.valobj.GetChildMemberWithName('m_url'), dict()).to_string()
+
+ def origin(self):
+ security_origin_ptr = self.valobj.GetChildMemberWithName('m_securityOriginPolicy').GetChildMemberWithName('m_ptr').GetChildMemberWithName('m_securityOrigin').GetChildMemberWithName('m_ptr')
+ return WebCoreSecurityOriginProvider(security_origin_ptr, dict()).to_string()
+
+ def page_cache_state(self):
+ return self.valobj.GetChildMemberWithName('m_pageCacheState').GetValue()
+
+ def frame(self):
+ frame_ptr = self.valobj.GetChildMemberWithName('m_frame')
+ if not frame_ptr or not bool(frame_ptr.GetValueAsUnsigned(0)):
+ return None
+ return WebCoreFrameProvider(frame_ptr, dict())
+
+
class WTFOptionSetProvider:
def __init__(self, valobj, internal_dict):
self.valobj = valobj