1digraph URLRequestRoot { 2 subgraph cluster_legend { 3 label="Legend"; 4 5 ## The following legend is an attempt to match UML notation, 6 ## except for template_class and Factory->object, which are 7 ## invented for this diagram. 8 BaseClass; 9 SubClass [label="Derived Class"]; 10 Whole; 11 Part; 12 A; 13 B; 14 Interface [label="Interface / ABC", style=dashed]; 15 template_class [shape=diamond]; # Link will name parameter(s) 16 17 SubClass -> BaseClass [arrowhead="empty"]; 18 SubClass -> Interface [arrowhead="empty", style=dashed]; 19 Part -> Whole [arrowhead="diamond", label="ownership"]; 20 Part -> Whole [arrowhead="odiamond", label="pointer"]; 21 A -> B [arrowhead="none", headlabel="?..?", taillabel="?..?", 22 label="association"]; 23 // Often a "subgraph { rank=same; .. }" is used to wrap the 24 // below to make the generative relationship distinctive 25 // from the other class relationships. 26 Factory -> object [arrowhead=veevee]; 27 }; 28 29 ## URLRequest, URLRequestJob, and subclasses 30 URLRequestContext; 31 URLRequest; 32 URLRequestJob [style=dashed]; 33 URLRequestJob_Others [label="...other job types..."]; 34 URLRequestHttpJob; 35 Filter; 36 37 {URLRequestHttpJob, URLRequestJob_Others} -> URLRequestJob 38 [arrowhead="empty"]; 39 40 URLRequestJob -> URLRequest [arrowhead="diamond"]; 41 Filter -> URLRequestJob [arrowhead="diamond"]; 42 Filter -> Filter [arrowhead="diamond", taillabel="0..1"]; 43 44 subgraph { 45 rank=same; 46 URLRequestContext -> URLRequest [arrowhead=veevee]; 47 } 48 subgraph { 49 rank=same; 50 URLRequestHttpJob -> Filter [arrowhead=veevee]; 51 } 52 53 54 ## HttpTransaction, subclasses, and generative classes. 55 HttpTransactionFactory [style=dashed]; 56 HttpCache; 57 HttpNetworkLayer; 58 HttpTransaction [style=dashed]; 59 HttpCache_Transaction [label="HttpCache::Transaction"]; 60 HttpNetworkTransaction; 61 62 { HttpNetworkTransaction, HttpCache_Transaction } -> HttpTransaction 63 [style=dashed, arrowhead="empty"]; 64 { HttpNetworkLayer, HttpCache } -> HttpTransactionFactory 65 [arrowhead=empty, style=dashed]; 66 67 HttpTransaction -> HttpCache_Transaction [arrowhead=diamond]; 68 HttpTransaction -> URLRequestHttpJob [arrowhead="diamond"] 69 70 subgraph { 71 rank=same; 72 HttpCache -> HttpCache_Transaction [arrowhead=veevee]; 73 } 74 subgraph { 75 rank=same; 76 HttpTransactionFactory -> HttpTransaction [arrowhead=veevee]; 77 } 78 subgraph { 79 rank=same; 80 HttpNetworkLayer -> HttpNetworkTransaction [arrowhead=veevee]; 81 } 82 83 ## HttpStreamFactory and related. 84 HttpStreamFactory; 85 HttpStreamRequest; 86 HttpStream [style=dashed]; 87 HttpStreamFactory_Job [label="HttpStreamFactory::Job"]; 88 HttpStreamRequest_Delegate 89 [label="HttpStreamRequest::Delegate",style=dashed]; 90 HttpBasicStream; 91 QuicHttpStream; 92 SpdyHttpStream; 93 HttpBasicState; 94 95 HttpNetworkTransaction -> HttpStreamRequest_Delegate 96 [style=dashed, arrowhead="empty"]; 97 { HttpBasicStream, QuicHttpStream, SpdyHttpStream } -> HttpStream 98 [style=dashed, arrowhead="empty"]; 99 100 HttpStreamRequest -> HttpNetworkTransaction [arrowhead="diamond"]; 101 HttpStream -> HttpNetworkTransaction [arrowhead="diamond"]; 102 HttpBasicState -> HttpBasicStream [arrowhead=diamond]; 103 HttpStreamFactory_Job -> HttpStreamRequest 104 [arrowhead="diamond",taillabel="1..*"]; 105 106 HttpStreamRequest_Delegate -> HttpStreamRequest 107 [arrowhead=odiamond]; 108 HttpStreamFactory_Job -> HttpStreamFactory_Job 109 [arrowhead=odiamond, label="blocking_job_\nwaiting_job_"]; 110 111 subgraph { 112 rank=same; 113 HttpStreamFactory -> HttpStreamRequest [arrowhead=veevee]; 114 } 115 subgraph { 116 rank=same; 117 HttpStreamRequest -> HttpStream [arrowhead=veevee]; 118 } 119 120 ## ClientSocketHandle and socket pools. 121 ClientSocketPool [style=dashed]; 122 TransportClientSocketPool; 123 SSLClientSocketPool; 124 ClientSocketPool_Others [label="...others..."]; 125 ClientSocketPoolBase [label="ClientSocketPoolBase", shape=diamond]; 126 ClientSocketPoolBaseHelper; 127 128 ConnectJobFactory; 129 ConnectJob [style=dashed]; 130 TransportConnectJob; 131 SSLConnectJob; 132 ConnectJob_Others [label="...other connect job types..."]; 133 ConnectJob_Delegate [label="ConnectJob::Delegate",style=dashed]; 134 135 StreamSocket [style=dashed]; 136 TransportClientSocket [style=dashed]; 137 TCPClientSocket; 138 StreamSocket_Others [label="...other socket types..."]; 139 140 TransportConnectJobHelper; 141 SingleRequestHostResolver; 142 143 { SSLClientSocketPool, TransportClientSocketPool, 144 ClientSocketPool_Others} -> ClientSocketPool 145 [style=dashed, arrowhead=empty]; 146 ClientSocketPoolBaseHelper -> ConnectJob_Delegate 147 [arrowhead=empty, style=dashed]; 148 StreamSocket -> Socket [arrowhead=empty, style=dashed]; 149 TCPClientSocket -> TransportClientSocket 150 [arrowhead=empty, style=dashed]; 151 TransportClientSocket -> StreamSocket 152 [arrowhead=empty, style=dashed]; 153 StreamSocket_Others -> StreamSocket 154 [arrowhead=empty, style=dashed]; 155 {SSLConnectJob, TransportConnectJob, ConnectJob_Others} -> ConnectJob 156 [style=dashed, arrowhead=empty]; 157 158 ClientSocketHandle -> HttpStreamFactory_Job [arrowhead="diamond"]; 159 ClientSocketHandle -> HttpBasicState [arrowhead="diamond"]; 160 ClientSocketPoolBaseHelper -> ClientSocketPoolBase [arrowhead=diamond]; 161 ClientSocketPoolBase -> TransportClientSocketPool 162 [arrowhead=diamond, label=TransportSocketParams]; 163 ClientSocketPoolBase -> SSLClientSocketPool 164 [arrowhead=diamond, label=SSLSocketParams]; 165 166 StreamSocket -> ClientSocketHandle [arrowhead=diamond]; 167 ConnectJobFactory -> ClientSocketPoolBase [arrowhead=diamond]; 168 StreamSocket -> ConnectJob [arrowhead=diamond]; 169 SingleRequestHostResolver -> TransportConnectJobHelper 170 [arrowhead=diamond]; 171 TransportConnectJobHelper -> TransportConnectJob [arrowhead=diamond]; 172 173 ClientSocketPool -> ClientSocketHandle [arrowhead=odiamond]; 174 ConnectJob_Delegate -> ConnectJob [arrowhead=odiamond]; 175 176 subgraph { 177 rank=same; 178 ConnectJobFactory -> ConnectJob [arrowhead=veevee]; 179 } 180 subgraph { 181 rank=same; 182 HttpStreamFactory_Job -> ClientSocketHandle [arrowhead=veevee]; 183 } 184 subgraph { 185 rank=same; 186 TransportConnectJob -> StreamSocket [arrowhead=veevee]; 187 } 188} 189