15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_REQUIREMENTS_CHECKER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_REQUIREMENTS_CHECKER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPUFeatureChecker; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validates the 'requirements' extension manifest field. This is an 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronous process that involves several threads, but the public interface 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of this class (including constructor and destructor) must only be used on 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequirementsChecker : public base::SupportsWeakPtr<RequirementsChecker> { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequirementsChecker(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RequirementsChecker(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The vector passed to the callback are any localized errors describing 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requirement violations. If this vector is non-empty, requirements checking 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // failed. This should only be called once. |callback| will always be invoked 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously on the UI thread. |callback| will only be called once, and 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be reset after called. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Check(scoped_refptr<const Extension> extension, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(std::vector<std::string> requirement)> callback); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callbacks for the GPUFeatureChecker. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetWebGLAvailability(bool available); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeRunCallback(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> errors_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Every requirement that needs to be resolved asynchronously will add to 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this counter. When the counter is depleted, the callback will be run. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pending_requirement_checks_; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<GPUFeatureChecker> webgl_checker_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(std::vector<std::string> requirement_errorss)> callback_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_REQUIREMENTS_CHECKER_H_ 57