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)function TimelineModelShim() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracing.TimelineModel.apply(this, arguments);
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TimelineModelShim.prototype = {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __proto__: tracing.TimelineModel.prototype,
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  invokeMethod: function(methodName, args) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var sendToPython = function(obj) {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We use sendJSON here because domAutomationController's send() chokes on
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // large amounts of data. Inside of send() it converts the arg to JSON and
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // invokes sendJSON. The JSON conversion is what fails. This way works
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // around the bad code, but note that the recieving python converts from
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // JSON before passing it back to the pyauto test.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window.domAutomationController.sendJSON(
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          JSON.stringify(obj)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = this[methodName].apply(this, JSON.parse(args));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } catch( e ) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var ret = {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success: false,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message: 'Unspecified error',
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We'll try sending the entire exception. If that doesn't work, it's ok.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret.exception = JSON.stringify(e);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } catch(e2) {}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( typeof(e) == 'string' || e instanceof String ) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret.message = e;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( e.stack != undefined ) ret.stack = e.stack;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( e.message != undefined ) ret.message = e.message;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sendToPython(ret);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throw e;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendToPython({
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      success: true,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data: result
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)},
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This causes the PyAuto ExecuteJavascript call which executed this file to
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)window.domAutomationController.send('');
54