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