OLD | NEW |
1 # High-level overview of Save-Page-As code | 1 # High-level overview of Save-Page-As code |
2 | 2 |
3 This document describes code under `//content/browser/downloads` | 3 This document describes code under `//content/browser/downloads` |
4 restricting the scope only to code handling Save-Page-As functionality | 4 restricting the scope only to code handling Save-Page-As functionality |
5 (i.e. leaving out other downloads-related code). | 5 (i.e. leaving out other downloads-related code). |
6 This document focuses on high-level overview and aspects of the code that | 6 This document focuses on high-level overview and aspects of the code that |
7 span multiple compilation units (hoping that individual compilation units | 7 span multiple compilation units (hoping that individual compilation units |
8 are described by their code comments or by their code structure). | 8 are described by their code comments or by their code structure). |
9 | 9 |
10 ## Classes overview | 10 ## Classes overview |
11 | 11 |
12 * SavePackage class | 12 * SavePackage class |
13 * coordinates overall save-page-as request | 13 * coordinates overall save-page-as request |
14 * created and owned by `WebContents` | 14 * created and owned by `WebContents` |
15 (ref-counted today, but it is unnecessary - see https://crbug.com/596953) | 15 (ref-counted today, but it is unnecessary - see https://crbug.com/596953) |
16 * UI-thread object | 16 * UI-thread object |
17 | 17 |
18 * SaveFileCreateInfo::SaveFileSource enum | 18 * SaveFileCreateInfo::SaveFileSource enum |
19 * classifies `SaveItem` and `SaveFile` processing into 3 flavours: | 19 * classifies `SaveItem` and `SaveFile` processing into 2 flavours: |
20 * `SAVE_FILE_FROM_NET` (see `SaveFileResourceHandler`) | 20 * `SAVE_FILE_FROM_NET` (see `SaveFileResourceHandler`) |
21 * `SAVE_FILE_FROM_DOM` (see "Complete HTML" section below) | 21 * `SAVE_FILE_FROM_DOM` (see "Complete HTML" section below) |
22 * `SAVE_FILE_FROM_FILE` (see `SaveFileManager::SaveLocalFile`) | |
23 | 22 |
24 * SaveItem class | 23 * SaveItem class |
25 * tracks saving a single file | 24 * tracks saving a single file |
26 * created and owned by `SavePackage` | 25 * created and owned by `SavePackage` |
27 * UI-thread object | 26 * UI-thread object |
28 | 27 |
29 * SaveFileManager class | 28 * SaveFileManager class |
30 * coordinates between FILE and UI threads | 29 * coordinates between FILE and UI threads |
31 * Gets requests from `SavePackage` and communicates results back to | 30 * Gets requests from `SavePackage` and communicates results back to |
32 `SavePackage` on the UI thread. | 31 `SavePackage` on the UI thread. |
(...skipping 28 matching lines...) Expand all Loading... |
61 The flow is different depending on the save format chosen by the user | 60 The flow is different depending on the save format chosen by the user |
62 (each flow is described in a separate section below). | 61 (each flow is described in a separate section below). |
63 | 62 |
64 ### Complete HTML | 63 ### Complete HTML |
65 | 64 |
66 Very high-level flow of saving a page as "Complete HTML": | 65 Very high-level flow of saving a page as "Complete HTML": |
67 | 66 |
68 * Step 1: `SavePackage` asks all frames for "savable resources" | 67 * Step 1: `SavePackage` asks all frames for "savable resources" |
69 and creates `SaveItem` for each of files that need to be saved | 68 and creates `SaveItem` for each of files that need to be saved |
70 | 69 |
71 * Step 2: `SavePackage` first processes `SAVE_FILE_FROM_NET` and | 70 * Step 2: `SavePackage` first processes `SAVE_FILE_FROM_NET` |
72 `SAVE_FILE_FROM_FILE` `SaveItem`s and asks `SaveFileManager` to save | 71 `SaveItem`s and asks `SaveFileManager` to save |
73 them. | 72 them. |
74 | 73 |
75 * Step 3: `SavePackage` handles remaining `SAVE_FILE_FROM_DOM` `SaveItem`s and | 74 * Step 3: `SavePackage` handles remaining `SAVE_FILE_FROM_DOM` `SaveItem`s and |
76 asks each frame to serialize its DOM/HTML (each frame gets from | 75 asks each frame to serialize its DOM/HTML (each frame gets from |
77 `SavePackage` a map covering local paths that need to be referenced by | 76 `SavePackage` a map covering local paths that need to be referenced by |
78 the frame). Responses from frames get forwarded to `SaveFileManager` | 77 the frame). Responses from frames get forwarded to `SaveFileManager` |
79 to be written to disk. | 78 to be written to disk. |
80 | 79 |
81 | 80 |
82 ### MHTML | 81 ### MHTML |
(...skipping 19 matching lines...) Expand all Loading... |
102 | 101 |
103 Note: MHTML format is by default disabled in Save-Page-As UI on Windows, MacOS | 102 Note: MHTML format is by default disabled in Save-Page-As UI on Windows, MacOS |
104 and Linux (it is the default on ChromeOS), but for testing this can be easily | 103 and Linux (it is the default on ChromeOS), but for testing this can be easily |
105 changed using `--save-page-as-mhtml` command line switch. | 104 changed using `--save-page-as-mhtml` command line switch. |
106 | 105 |
107 | 106 |
108 ### HTML Only | 107 ### HTML Only |
109 | 108 |
110 Very high-level flow of saving a page as "HTML Only": | 109 Very high-level flow of saving a page as "HTML Only": |
111 | 110 |
112 * `SavePackage` creates only a single `SaveItem` (either `SAVE_FILE_FROM_NET` or | 111 * `SavePackage` creates only a single `SaveItem` (always `SAVE_FILE_FROM_NET`) |
113 `SAVE_FILE_FROM_FILE`) and asks `SaveFileManager` to process it | 112 and asks `SaveFileManager` to process it |
114 (as in the Complete HTML individual SaveItem handling above.). | 113 (as in the Complete HTML individual SaveItem handling above.). |
115 | 114 |
116 | 115 |
117 ## Other relevant code | 116 ## Other relevant code |
118 | 117 |
119 Pointers to related code outside of `//content/browser/download`: | 118 Pointers to related code outside of `//content/browser/download`: |
120 | 119 |
121 * End-to-end tests: | 120 * End-to-end tests: |
122 * `//chrome/browser/downloads/save_page_browsertest.cc` | 121 * `//chrome/browser/downloads/save_page_browsertest.cc` |
123 * `//chrome/test/data/save_page/...` | 122 * `//chrome/test/data/save_page/...` |
124 | 123 |
125 * Other tests: | 124 * Other tests: |
126 * `//content/browser/downloads/*test*.cc` | 125 * `//content/browser/downloads/*test*.cc` |
127 * `//content/renderer/dom_serializer_browsertest.cc` - single process... :-/ | 126 * `//content/renderer/dom_serializer_browsertest.cc` - single process... :-/ |
128 | 127 |
129 * Elsewhere in `//content`: | 128 * Elsewhere in `//content`: |
130 * `//content/renderer/savable_resources...` | 129 * `//content/renderer/savable_resources...` |
131 | 130 |
132 * Blink: | 131 * Blink: |
133 * `//third_party/WebKit/public/web/WebFrameSerializer...` | 132 * `//third_party/WebKit/public/web/WebFrameSerializer...` |
134 * `//third_party/WebKit/Source/web/WebFrameSerializerImpl...` | 133 * `//third_party/WebKit/Source/web/WebFrameSerializerImpl...` |
135 (used for Complete HTML today; should use `FrameSerializer` instead in | 134 (used for Complete HTML today; should use `FrameSerializer` instead in |
136 the long-term - see https://crbug.com/328354). | 135 the long-term - see https://crbug.com/328354). |
137 * `//third_party/WebKit/Source/core/frame/FrameSerializer...` | 136 * `//third_party/WebKit/Source/core/frame/FrameSerializer...` |
138 (used for MHTML today) | 137 (used for MHTML today) |
139 * `//third_party/WebKit/Source/platform/mhtml/MHTMLArchive...` | 138 * `//third_party/WebKit/Source/platform/mhtml/MHTMLArchive...` |
140 | 139 |
OLD | NEW |