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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Custom binding for the pageCapture API.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var binding = require('binding').Binding.create('pageCapture');
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvar handleUncaughtException = require('uncaught_exception_handler').handle;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var pageCaptureNatives = requireNative('page_capture');
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var CreateBlob = pageCaptureNatives.CreateBlob;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var SendResponseAck = pageCaptureNatives.SendResponseAck;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)binding.registerCustomHook(function(bindingsAPI) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var apiFunctions = bindingsAPI.apiFunctions;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apiFunctions.setCustomCallback('saveAsMHTML',
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 function(name, request, response) {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    var callback = request.callback;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.callback = null;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (response)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength);
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    try {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      callback(response);
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } catch (e) {
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      handleUncaughtException(
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack);
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } finally {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Notify the browser. Now that the blob is referenced from JavaScript,
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // the browser can drop its reference to it.
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SendResponseAck(request.id);
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.binding = binding.generate();
38