Объекты плагинов в WebView уничтожаются? - PullRequest
1 голос
/ 15 марта 2011

Вот моя ситуация:

Я написал простой веб-браузер.Навигация по вкладкам была достаточно простой, чтобы начать работать, как только я обернулся вокруг понятий и понял, как выполнять операции над конкретными вкладками.Он хорошо работает и довольно надежен в большинстве случаев.

Однако проблема мучает меня, и я не могу выяснить ее причину.

Допустим, я открываю новую вкладку и перехожу на YouTube,Я нажимаю на видео, и загружается флеш-плеер.Видео проигрывается и все отлично работает.Теперь я создаю еще одну новую вкладку и перехожу на какой-то сайт.Звук из проигрывателя YouTube полностью останавливается.

Когда я снова переключаюсь на вкладку YouTube, страница все равно будет там, как и прежде, за исключением того, что проигрыватель должен полностью перезагрузиться, как если бы я только что перезагрузилстр.Похоже, это относится и к другим типам плагинов.

Что вызывает это?

Сборка мусора не включена, и, насколько я знаю, я правильно создаю веб-представления.Есть ли какая-нибудь глупая, простая вещь, которую я пропустил где-то вдоль линии?

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Метод - (void)setHostWindow:(NSWindow *)hostWindow в WebView, вероятно, то, что вы ищете.

У меня возникала та же проблема со флэш-памятью при перезагрузке WebView всякий раз, когда менялась маска файла окна включения. Перенос звонка на setStyleMask устранил проблему следующим образом:

NSWindow *hostWindow = [[NSWindow alloc] init];
[self.webView setHostWindow:hostWindow];
[[self windowForSheet] setStyleMask:styleMask];
[self.webView setHostWindow:nil];
[hostWindow release];

Документация для метода не является звездной, но в ней явно указывается наличие WebView внутри NSTabView в качестве одного из вариантов использования:

Этот метод устанавливает окно хоста получателя в hostWindow. Ваше приложение должно использовать этот метод только в том случае, если веб-представление будет временно удалено из его окна, и вы хотите, чтобы веб-представление продолжало работать (например, вы не хотите прерывать текущую загрузку). Поскольку получатель сохраняет hostWindow, вы обязаны установить для хост-окна значение nil, прежде чем закрывать окно, чтобы избежать цикла сохранения.

Например, вы можете вызвать этот метод, если присоедините веб-представление к объекту NSTabView (как в реализации браузера с вкладками). Объект NSTabView выводит представления из окна, когда они не находятся на активной вкладке, поэтому вам необходимо вызвать этот метод, прежде чем веб-представление будет удалено из его окна. Если вы не вызовете этот метод, плагины перестанут работать, когда веб-представление будет удалено из его окна.

0 голосов
/ 10 октября 2013

У меня была похожая проблема, но с окном с веб-представлением, которое закрыто и восстановлено.К сожалению, решение @mlwelles не решило проблему в одиночку.

Однако, что удалось решить, так это удалить webView из окна до того, как оно закроется (важно правильно выбрать время).Я придумал что-то вроде этого:

id contentView;
id tmpHostWindow;
[window setDelegate:self];

- (BOOL)windowShouldClose:(NSNotification *)notification
{
    // set temporary hostWindow on WebView and remove it from
    // the closed window to prevent stopping flash plugin
    // (windowWillClose would be better but that doesn't always work)

    tmpHostWindow = [[NSWindow alloc] init];
    [webView setHostWindow:tmpHostWindow];
    [window setContentView:nil];
    [contentView removeFromSuperview];

    return TRUE;
}

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    // restore "hidden" webview
    // (would be better to do it in applicationShouldHandleReopen
    // but that seems to be too early (has no effect)

    if ([window contentView] != contentView) {
        [window setContentView:contentView];
        [webView setHostWindow:nil];
        tmpHostWindow = nil;
    }
}
...