Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(751)

Side by Side Diff: Source/core/html/HTMLImportsController.cpp

Issue 17137008: Extract HTMLImportLoader from LinkImport (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: For landing. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/html/HTMLImportsController.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 42
43 namespace WebCore { 43 namespace WebCore {
44 44
45 PassRefPtr<LinkImport> LinkImport::create(HTMLLinkElement* owner) 45 PassRefPtr<LinkImport> LinkImport::create(HTMLLinkElement* owner)
46 { 46 {
47 return adoptRef(new LinkImport(owner)); 47 return adoptRef(new LinkImport(owner));
48 } 48 }
49 49
50 LinkImport::LinkImport(HTMLLinkElement* owner) 50 LinkImport::LinkImport(HTMLLinkElement* owner)
51 : LinkResource(owner) 51 : LinkResource(owner)
52 , m_controller(0)
53 , m_ofSameLocation(0)
54 , m_state(StatePreparing)
55 { 52 {
56 } 53 }
57 54
58 LinkImport::~LinkImport() 55 LinkImport::~LinkImport()
59 { 56 {
57 }
58
59 Document* LinkImport::importedDocument() const
60 {
61 if (!m_loader)
62 return 0;
63 return m_loader->importedDocument();
64 }
65
66 void LinkImport::process()
67 {
68 if (m_loader)
69 return;
70 if (!m_owner)
71 return;
72
73 // FIXME(morrita): Should take care of sub-imports whose document doesn't ha ve frame.
74 if (!m_owner->document()->frame())
75 return;
76
77 LinkRequestBuilder builder(m_owner);
78 if (!builder.isValid())
79 return;
80
81 HTMLImportsController* controller = m_owner->document()->ensureImports();
82 if (RefPtr<HTMLImportLoader> found = controller->findLinkFor(builder.url())) {
83 m_loader = found;
84 return;
85 }
86
87 CachedResourceRequest request = builder.build(true);
88 CachedResourceHandle<CachedScript> resource = m_owner->document()->cachedRes ourceLoader()->requestScript(request);
89 m_loader = HTMLImportLoader::create(controller, builder.url(), resource);
90 }
91
92 void LinkImport::ownerRemoved()
93 {
94 m_owner = 0;
95 m_loader.clear();
96 }
97
98
99 PassRefPtr<HTMLImportLoader> HTMLImportLoader::create(HTMLImportsController* con troller, const KURL& url, const CachedResourceHandle<CachedScript>& resource)
100 {
101 RefPtr<HTMLImportLoader> loader = adoptRef(new HTMLImportLoader(controller, url, resource));
102 controller->addImport(loader);
103 return loader;
104 }
105
106 HTMLImportLoader::HTMLImportLoader(HTMLImportsController* controller, const KURL & url, const CachedResourceHandle<CachedScript>& resource)
107 : m_controller(controller)
108 , m_state(StateLoading)
109 , m_resource(resource)
110 , m_url(url)
111 {
112 m_resource->addClient(this);
113 }
114
115 HTMLImportLoader::~HTMLImportLoader()
116 {
60 if (m_resource) 117 if (m_resource)
61 m_resource->removeClient(this); 118 m_resource->removeClient(this);
62 } 119 }
63 120
64 LinkImport::State LinkImport::finish() 121 void HTMLImportLoader::notifyFinished(CachedResource*)
122 {
123 setState(finish());
124 }
125
126 void HTMLImportLoader::setState(State state)
127 {
128 if (m_state == state)
129 return;
130 m_state = state;
131
132 if ((m_state == StateReady || m_state == StateError) && m_controller)
133 m_controller->didLoad();
134 }
135
136 HTMLImportLoader::State HTMLImportLoader::finish()
65 { 137 {
66 if (!m_controller) 138 if (!m_controller)
67 return StateError; 139 return StateError;
68 140
69 if (m_resource->loadFailedOrCanceled()) 141 if (m_resource->loadFailedOrCanceled())
70 return StateError; 142 return StateError;
71 143
72 String error; 144 String error;
73 if (!m_controller->securityOrigin()->canRequest(m_resource->response().url() ) 145 if (!m_controller->securityOrigin()->canRequest(m_resource->response().url() )
74 && !m_resource->passesAccessControlCheck(m_controller->securityOrigin(), error)) { 146 && !m_resource->passesAccessControlCheck(m_controller->securityOrigin(), error)) {
75 m_controller->showSecurityErrorMessage("Import from origin '" + Security Origin::create(m_resource->response().url())->toString() + "' has been blocked f rom loading by Cross-Origin Resource Sharing policy: " + error); 147 m_controller->showSecurityErrorMessage("Import from origin '" + Security Origin::create(m_resource->response().url())->toString() + "' has been blocked f rom loading by Cross-Origin Resource Sharing policy: " + error);
76 return StateError; 148 return StateError;
77 } 149 }
78 150
79 // FIXME(morrita): This should be done in incremental way. 151 // FIXME(morrita): This should be done in incremental way.
80 m_importedDocument = HTMLDocument::create(0, m_resource->response().url()); 152 m_importedDocument = HTMLDocument::create(0, m_resource->response().url());
81 m_importedDocument->setContent(m_resource->script()); 153 m_importedDocument->setContent(m_resource->script());
82 154
83 return StateReady; 155 return StateReady;
84 } 156 }
85 157
86 void LinkImport::notifyFinished(CachedResource*) 158 Document* HTMLImportLoader::importedDocument() const
87 { 159 {
88 setState(finish());
89 }
90
91 void LinkImport::setState(State state)
92 {
93 if (m_state == state)
94 return;
95 m_state = state;
96
97 if ((m_state == StateReady || m_state == StateError)
98 && m_controller)
99 m_controller->didLoad();
100 }
101
102 LinkImport::State LinkImport::startRequest()
103 {
104 ASSERT(m_owner);
105 ASSERT(m_state == StatePreparing);
106
107 // FIXME(morrita): Should take care of sub-imports whose document doesn't ha ve frame.
108 if (!m_owner->document()->frame())
109 return StateError;
110
111 LinkRequestBuilder builder(m_owner);
112 if (!builder.isValid())
113 return StateError;
114
115 m_controller = m_owner->document()->ensureImports();
116 if (RefPtr<LinkImport> found = m_controller->findLinkFor(builder.url())) {
117 m_ofSameLocation = found.get();
118 return StateReady;
119 }
120
121 CachedResourceRequest request = builder.build(true);
122 m_resource = m_owner->document()->cachedResourceLoader()->requestScript(requ est);
123 if (!m_resource)
124 return StateError;
125
126 m_resource->addClient(this);
127 m_url = builder.url();
128 m_controller->addImport(this);
129
130 return StateStarted;
131 }
132
133 Document* LinkImport::importedDocument() const
134 {
135 if (!m_owner)
136 return 0;
137 if (m_state != StateReady) 160 if (m_state != StateReady)
138 return 0; 161 return 0;
139
140 if (m_ofSameLocation) {
141 ASSERT(!m_importedDocument);
142 return m_ofSameLocation->importedDocument();
143 }
144
145 return m_importedDocument.get(); 162 return m_importedDocument.get();
146 } 163 }
147 164
148 void LinkImport::process() 165 void HTMLImportLoader::importDestroyed()
149 {
150 if (StatePreparing != m_state)
151 return;
152 setState(startRequest());
153 }
154
155 void LinkImport::ownerRemoved()
156 {
157 m_owner = 0;
158 }
159
160 void LinkImport::importDestroyed()
161 { 166 {
162 m_controller = 0; 167 m_controller = 0;
163 m_importedDocument.clear(); 168 m_importedDocument.clear();
164 } 169 }
165 170
171
166 PassOwnPtr<HTMLImportsController> HTMLImportsController::create(Document* master ) 172 PassOwnPtr<HTMLImportsController> HTMLImportsController::create(Document* master )
167 { 173 {
168 return adoptPtr(new HTMLImportsController(master)); 174 return adoptPtr(new HTMLImportsController(master));
169 } 175 }
170 176
171 HTMLImportsController::HTMLImportsController(Document* master) 177 HTMLImportsController::HTMLImportsController(Document* master)
172 : m_master(master) 178 : m_master(master)
173 { 179 {
174 } 180 }
175 181
176 HTMLImportsController::~HTMLImportsController() 182 HTMLImportsController::~HTMLImportsController()
177 { 183 {
178 for (size_t i = 0; i < m_imports.size(); ++i) 184 for (size_t i = 0; i < m_imports.size(); ++i)
179 m_imports[i]->importDestroyed(); 185 m_imports[i]->importDestroyed();
180 } 186 }
181 187
182 void HTMLImportsController::addImport(PassRefPtr<LinkImport> link) 188 void HTMLImportsController::addImport(PassRefPtr<HTMLImportLoader> link)
183 { 189 {
184 ASSERT(!link->url().isEmpty() && link->url().isValid()); 190 ASSERT(!link->url().isEmpty() && link->url().isValid());
185 m_imports.append(link); 191 m_imports.append(link);
186 } 192 }
187 193
188 void HTMLImportsController::showSecurityErrorMessage(const String& message) 194 void HTMLImportsController::showSecurityErrorMessage(const String& message)
189 { 195 {
190 m_master->addConsoleMessage(JSMessageSource, ErrorMessageLevel, message); 196 m_master->addConsoleMessage(JSMessageSource, ErrorMessageLevel, message);
191 } 197 }
192 198
193 void HTMLImportsController::didLoad() 199 void HTMLImportsController::didLoad()
194 { 200 {
195 if (haveLoaded()) 201 if (haveLoaded())
196 m_master->didLoadAllImports(); 202 m_master->didLoadAllImports();
197 } 203 }
198 204
199 PassRefPtr<LinkImport> HTMLImportsController::findLinkFor(const KURL& url) const 205 PassRefPtr<HTMLImportLoader> HTMLImportsController::findLinkFor(const KURL& url) const
200 { 206 {
201 for (size_t i = 0; i < m_imports.size(); ++i) { 207 for (size_t i = 0; i < m_imports.size(); ++i) {
202 if (m_imports[i]->url() == url) 208 if (m_imports[i]->url() == url)
203 return m_imports[i]; 209 return m_imports[i];
204 } 210 }
205 211
206 return 0; 212 return 0;
207 } 213 }
208 214
209 SecurityOrigin* HTMLImportsController::securityOrigin() const 215 SecurityOrigin* HTMLImportsController::securityOrigin() const
210 { 216 {
211 return m_master->securityOrigin(); 217 return m_master->securityOrigin();
212 } 218 }
213 219
214 bool HTMLImportsController::haveLoaded() const 220 bool HTMLImportsController::haveLoaded() const
215 { 221 {
216 for (size_t i = 0; i < m_imports.size(); ++i) { 222 for (size_t i = 0; i < m_imports.size(); ++i) {
217 if (!m_imports[i]->isDone()) 223 if (!m_imports[i]->isDone())
218 return false; 224 return false;
219 } 225 }
220 226
221 return true; 227 return true;
222 } 228 }
223 229
224 } // namespace WebCore 230 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/html/HTMLImportsController.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698