1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @fileoverview Base class for all login WebUI screens.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)cr.define('login', function() {
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var Screen = cr.ui.define('div');
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Screen.prototype = {
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    __proto__: HTMLDivElement.prototype,
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    decorate: function() {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Screen: Screen
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)});
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)cr.define('login', function() {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Creates class and object for screen.
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Methods specified in EXTERNAL_API array of prototype
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * will be available from C++ part.
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Example:
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     login.createScreen('ScreenName', 'screen-id', {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *       foo: function() { console.log('foo'); },
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *       bar: function() { console.log('bar'); }
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *       EXTERNAL_API: ['foo'];
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     });
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     login.ScreenName.register();
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     var screen = $('screen-id');
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     screen.foo(); // valid
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     login.ScreenName.foo(); // valid
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     screen.bar(); // valid
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     login.ScreenName.bar(); // invalid
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param {string} name Name of created class.
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param {string} id Id of div representing screen.
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param {(function()|Object)} proto Prototype of object or function that
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *     returns prototype.
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    createScreen: function(name, id, proto) {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (typeof proto == 'function')
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        proto = proto();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cr.define('login', function() {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var api = proto.EXTERNAL_API || [];
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        for (var i = 0; i < api.length; ++i) {
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var methodName = api[i];
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (typeof proto[methodName] !== 'function')
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            throw Error('External method "' + methodName + '" for screen "' +
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                name + '" not a function or undefined.');
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var constructor = cr.ui.define(login.Screen);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        constructor.prototype = Object.create(login.Screen.prototype);
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Object.getOwnPropertyNames(proto).forEach(function(propertyName) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var descriptor =
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              Object.getOwnPropertyDescriptor(proto, propertyName);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          Object.defineProperty(constructor.prototype,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              propertyName, descriptor);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (api.indexOf(propertyName) >= 0) {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            constructor[propertyName] = (function(x) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              return function() {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                var screen = $(id);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return screen[x].apply(screen, arguments);
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              };
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            })(propertyName);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        });
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        constructor.prototype.name = function() { return id; };
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        constructor.register = function() {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var screen = $(id);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          constructor.decorate(screen);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          Oobe.getInstance().registerScreen(screen);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        };
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var result = {};
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        result[name] = constructor;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return result;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      });
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)});
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91