| digraph URLRequestRoot { | |
| subgraph cluster_legend { | |
| label="Legend"; | |
| ## The following legend is an attempt to match UML notation, | |
| ## except for template_class and Factory->object, which are | |
| ## invented for this diagram. | |
| BaseClass; | |
| SubClass [label="Derived Class"]; | |
| Whole; | |
| Part; | |
| A; | |
| B; | |
| Interface [label="Interface / ABC", style=dashed]; | |
| template_class [shape=diamond]; # Link will name parameter(s) | |
| SubClass -> BaseClass [arrowhead="empty"]; | |
| SubClass -> Interface [arrowhead="empty", style=dashed]; | |
| Part -> Whole [arrowhead="diamond", label="ownership"]; | |
| Part -> Whole [arrowhead="odiamond", label="pointer"]; | |
| A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", | |
| label="association"]; | |
| // Often a "subgraph { rank=same; .. }" is used to wrap the | |
| // below to make the generative relationship distinctive | |
| // from the other class relationships. | |
| Factory -> object [arrowhead=veevee]; | |
| }; | |
| ## URLRequest, URLRequestJob, and subclasses | |
| URLRequestContext; | |
| URLRequest; | |
| URLRequestJob [style=dashed]; | |
| URLRequestJob_Others [label="...other job types..."]; | |
| URLRequestHttpJob; | |
| Filter; | |
| {URLRequestHttpJob, URLRequestJob_Others} -> URLRequestJob | |
| [arrowhead="empty"]; | |
| URLRequestJob -> URLRequest [arrowhead="diamond"]; | |
| Filter -> URLRequestJob [arrowhead="diamond"]; | |
| Filter -> Filter [arrowhead="diamond", taillabel="0..1"]; | |
| subgraph { | |
| rank=same; | |
| URLRequestContext -> URLRequest [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| URLRequestHttpJob -> Filter [arrowhead=veevee]; | |
| } | |
| ## HttpTransaction, subclasses, and generative classes. | |
| HttpTransactionFactory; | |
| HttpCache; | |
| HttpNetworkLayer; | |
| HttpTransaction [style=dashed]; | |
| HttpCache_Transaction [label="HttpCache::Transaction"]; | |
| HttpNetworkTransaction; | |
| { HttpNetworkTransaction, HttpCache_Transaction } -> HttpTransaction | |
| [style=dashed, arrowhead="empty"]; | |
| { HttpNetworkLayer, HttpCache } -> HttpTransactionFactory | |
| [arrowhead=empty, style=dashed]; | |
| HttpTransaction -> HttpCache_Transaction [arrowhead=diamond]; | |
| HttpTransaction -> URLRequestHttpJob [arrowhead="diamond"] | |
| subgraph { | |
| rank=same; | |
| HttpCache -> HttpCache_Transaction [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| HttpTransactionFactory -> HttpTransaction [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| HttpNetworkLayer -> HttpNetworkTransaction [arrowhead=veevee]; | |
| } | |
| ## HttpStreamFactory and related. | |
| HttpStreamFactoryImpl; | |
| HttpStreamRequest [style=dashed]; | |
| HttpStream [style=dashed]; | |
| HttpStreamFactoryImpl_Request [label="HttpStreamFactoryImpl::Request"]; | |
| HttpStreamFactoryImpl_Job [label="HttpStreamFactoryImpl::Job"]; | |
| HttpStreamRequest_Delegate | |
| [label="HttpStreamRequest::Delegate",style=dashed]; | |
| HttpBasicStream; | |
| QuicHttpStream; | |
| SpdyHttpStream; | |
| HttpBasicState; | |
| HttpNetworkTransaction -> HttpStreamRequest_Delegate | |
| [style=dashed, arrowhead="empty"]; | |
| HttpStreamFactoryImpl_Request -> HttpStreamRequest | |
| [style=dashed, arrowhead="empty"]; | |
| { HttpBasicStream, QuicHttpStream, SpdyHttpStream } -> HttpStream | |
| [style=dashed, arrowhead="empty"]; | |
| HttpStreamRequest -> HttpNetworkTransaction [arrowhead="diamond"]; | |
| HttpStream -> HttpNetworkTransaction [arrowhead="diamond"]; | |
| HttpBasicState -> HttpBasicStream [arrowhead=diamond]; | |
| HttpStreamFactoryImpl_Job -> HttpStreamFactoryImpl_Request | |
| [arrowhead="diamond",taillabel="1..*"]; | |
| HttpStreamRequest_Delegate -> HttpStreamFactoryImpl_Request | |
| [arrowhead=odiamond]; | |
| HttpStreamFactoryImpl_Job -> HttpStreamFactoryImpl_Job | |
| [arrowhead=odiamond, label="blocking_job_\nwaiting_job_"]; | |
| subgraph { | |
| rank=same; | |
| HttpStreamFactoryImpl -> HttpStreamRequest [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| HttpStreamRequest -> HttpStream [arrowhead=veevee]; | |
| } | |
| ## ClientSocketHandle and socket pools. | |
| ClientSocketPool [style=dashed]; | |
| TransportClientSocketPool; | |
| SSLClientSocketPool; | |
| ClientSocketPool_Others [label="...others..."]; | |
| ClientSocketPoolBase [label="ClientSocketPoolBase", shape=diamond]; | |
| ClientSocketPoolBaseHelper; | |
| ConnectJobFactory; | |
| ConnectJob [style=dashed]; | |
| TransportConnectJob; | |
| SSLConnectJob; | |
| ConnectJob_Others [label="...other connect job types..."]; | |
| ConnectJob_Delegate [label="ConnectJob::Delegate",style=dashed]; | |
| StreamSocket [style=dashed]; | |
| TCPClientSocket; | |
| StreamSocket_Others [label="...other socket types..."]; | |
| TransportConnectJobHelper; | |
| SingleRequestHostResolver; | |
| { SSLClientSocketPool, TransportClientSocketPool, | |
| ClientSocketPool_Others} -> ClientSocketPool | |
| [style=dashed, arrowhead=empty]; | |
| ClientSocketPoolBaseHelper -> ConnectJob_Delegate | |
| [arrowhead=empty, style=dashed]; | |
| StreamSocket -> Socket [arrowhead=empty, style=dashed]; | |
| { TCPClientSocket, StreamSocket_Others } -> StreamSocket | |
| [arrowhead=empty, style=dashed]; | |
| {SSLConnectJob, TransportConnectJob, ConnectJob_Others} -> ConnectJob | |
| [style=dashed, arrowhead=empty]; | |
| ClientSocketHandle -> HttpStreamFactoryImpl_Job [arrowhead="diamond"]; | |
| ClientSocketHandle -> HttpBasicState [arrowhead="diamond"]; | |
| ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; | |
| ClientSocketPoolBase -> TransportClientSocketPool | |
| [arrowhead=diamond, label=TransportSocketParams]; | |
| ClientSocketPoolBase -> SSLClientSocketPool | |
| [arrowhead=diamond, label=SSLSocketParams]; | |
| StreamSocket -> ClientSocketHandle [arrowhead=diamond]; | |
| ConnectJobFactory -> ClientSocketPoolBase [arrowhead=diamond]; | |
| StreamSocket -> ConnectJob [arrowhead=diamond]; | |
| SingleRequestHostResolver -> TransportConnectJobHelper | |
| [arrowhead=diamond]; | |
| TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; | |
| ClientSocketPool -> ClientSocketHandle [arrowhead=odiamond]; | |
| ConnectJob_Delegate -> ConnectJob [arrowhead=odiamond]; | |
| subgraph { | |
| rank=same; | |
| ConnectJobFactory -> ConnectJob [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| HttpStreamFactoryImpl_Job -> ClientSocketHandle [arrowhead=veevee]; | |
| } | |
| subgraph { | |
| rank=same; | |
| TransportConnectJob -> StreamSocket [arrowhead=veevee]; | |
| } | |
| } |