void StyleResourceLoader::loadPendingShaders(RenderStyle* style, const ElementStyleResources& elementStyleResources) { if (!style->hasFilter() || !elementStyleResources.hasNewCustomFilterProgram()) return; Vector<RefPtr<FilterOperation> >& filterOperations = style->mutableFilter().operations(); for (unsigned i = 0; i < filterOperations.size(); ++i) { RefPtr<FilterOperation> filterOperation = filterOperations.at(i); if (filterOperation->getOperationType() == FilterOperation::CUSTOM) { CustomFilterOperation* customFilter = static_cast<CustomFilterOperation*>(filterOperation.get()); ASSERT(customFilter->program()); StyleCustomFilterProgram* program = static_cast<StyleCustomFilterProgram*>(customFilter->program()); // Note that the StylePendingShaders could be already resolved to StyleFetchedShaders. That's because the rule was matched before. // However, the StyleCustomFilterProgram that was initially created could have been removed from the cache in the meanwhile, // meaning that we get a new StyleCustomFilterProgram here that is not yet in the cache, but already has loaded StyleShaders. if (!program->hasPendingShaders() && program->inCache()) continue; RefPtr<StyleCustomFilterProgram> styleProgram = m_customFilterProgramCache->lookup(program); if (styleProgram.get()) { customFilter->setProgram(styleProgram.release()); } else { if (program->vertexShader() && program->vertexShader()->isPendingShader()) { CSSShaderValue* shaderValue = static_cast<StylePendingShader*>(program->vertexShader())->cssShaderValue(); program->setVertexShader(shaderValue->resource(m_fetcher)); } if (program->fragmentShader() && program->fragmentShader()->isPendingShader()) { CSSShaderValue* shaderValue = static_cast<StylePendingShader*>(program->fragmentShader())->cssShaderValue(); program->setFragmentShader(shaderValue->resource(m_fetcher)); } m_customFilterProgramCache->add(program); } } } }