/**
 * Copyright (c) Microsoft Corporation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import path from 'path';
import { assert } from '@isomorphic/assert';
import { Page } from './page';
import { Artifact } from './artifact';
export class Download {
    artifact;
    url;
    _uuid;
    _page;
    _suggestedFilename;
    constructor(page, downloadsPath, uuid, url, suggestedFilename, downloadFilename) {
        const unaccessibleErrorMessage = page.browserContext._options.acceptDownloads === 'deny' ? 'Pass { acceptDownloads: true } when you are creating your browser context.' : undefined;
        const downloadPath = path.join(downloadsPath, downloadFilename ?? uuid);
        this.artifact = new Artifact(page, downloadPath, unaccessibleErrorMessage, () => this.cancel());
        this._page = page;
        this.url = url;
        this._uuid = uuid;
        this._suggestedFilename = suggestedFilename;
        // Note: downloads are never removed from the context, so that we can delete them upon context closure.
        page.browserContext._downloads.add(this);
        if (suggestedFilename !== undefined)
            this._fireDownloadEvent();
    }
    cancel() {
        return this._page.browserContext.cancelDownload(this._uuid);
    }
    filenameSuggested(suggestedFilename) {
        assert(this._suggestedFilename === undefined);
        this._suggestedFilename = suggestedFilename;
        this._fireDownloadEvent();
    }
    suggestedFilename() {
        return this._suggestedFilename;
    }
    _fireDownloadEvent() {
        this._page.instrumentation.onDownload(this._page, this);
        this._page.emit(Page.Events.Download, this);
    }
}
//# sourceMappingURL=download.js.map