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