blob: 80a6c8b15844d3b257f5481e2f263f166bac41ef [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* Custom bindings for the mime handler API.
*/
var binding =
apiBridge || require('binding').Binding.create('mimeHandlerPrivate');
var utils = require('utils');
var NO_STREAM_ERROR =
'Streams are only available from a mime handler view guest.';
var STREAM_ABORTED_ERROR = 'Stream has been aborted.';
if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) {
loadScript('mojo_bindings');
}
loadScript('extensions/common/api/mime_handler.mojom');
var servicePtr = new extensions.mimeHandler.MimeHandlerServicePtr;
Mojo.bindInterface(extensions.mimeHandler.MimeHandlerService.name,
mojo.makeRequest(servicePtr).handle);
var beforeUnloadControlPtr =
new extensions.mimeHandler.BeforeUnloadControlPtr;
Mojo.bindInterface(
extensions.mimeHandler.BeforeUnloadControl.name,
mojo.makeRequest(beforeUnloadControlPtr).handle);
// Stores a promise to the GetStreamInfo() result to avoid making additional
// calls in response to getStreamInfo() calls.
var streamInfoPromise;
function throwNoStreamError() {
throw new Error(NO_STREAM_ERROR);
}
function createStreamInfoPromise() {
return servicePtr.getStreamInfo().then(function(result) {
if (!result.streamInfo)
throw new Error(STREAM_ABORTED_ERROR);
return result.streamInfo;
}, throwNoStreamError);
}
function constructStreamInfoDict(streamInfo) {
var headers = {};
for (var header of streamInfo.responseHeaders) {
headers[header[0]] = header[1];
}
return {
mimeType: streamInfo.mimeType,
originalUrl: streamInfo.originalUrl,
streamUrl: streamInfo.streamUrl,
tabId: streamInfo.tabId,
embedded: !!streamInfo.embedded,
responseHeaders: headers,
};
}
binding.registerCustomHook(function(bindingsAPI) {
var apiFunctions = bindingsAPI.apiFunctions;
utils.handleRequestWithPromiseDoNotUse(
apiFunctions, 'mimeHandlerPrivate', 'getStreamInfo',
function() {
if (!streamInfoPromise)
streamInfoPromise = createStreamInfoPromise();
return streamInfoPromise.then(constructStreamInfoDict);
});
utils.handleRequestWithPromiseDoNotUse(
apiFunctions, 'mimeHandlerPrivate', 'abortStream',
function() {
return servicePtr.abortStream().then(function() {});
});
utils.handleRequestWithPromiseDoNotUse(
apiFunctions, 'mimeHandlerPrivate', 'setShowBeforeUnloadDialog',
function(showDialog) {
return beforeUnloadControlPtr.setShowBeforeUnloadDialog(showDialog);
});
});
if (!apiBridge)
exports.$set('binding', binding.generate());