| /* |
| * Copyright (C) 2000 Harri Porten (porten@kde.org) |
| * Copyright (c) 2000 Daniel Molkentin (molkentin@kde.org) |
| * Copyright (c) 2000 Stefan Schimanski (schimmi@kde.org) |
| * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All Rights Reserved. |
| * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #include "config.h" |
| #include "JSNavigator.h" |
| |
| #include "Frame.h" |
| #include "FrameLoader.h" |
| #include "KURL.h" |
| #include "Navigator.h" |
| #include "Settings.h" |
| |
| namespace WebCore { |
| |
| using namespace JSC; |
| |
| static bool needsYouTubeQuirk(ExecState*, Frame*); |
| |
| #if 1 |
| |
| static inline bool needsYouTubeQuirk(ExecState*, Frame*) |
| { |
| return false; |
| } |
| |
| #else |
| |
| static bool needsYouTubeQuirk(ExecState* exec, Frame* frame) |
| { |
| // This quirk works around a mistaken check in an ad at youtube.com. |
| // There's a function called isSafari that returns false if the function |
| // called isWindows returns true; thus the site malfunctions with Windows Safari. |
| |
| // Do the quirk only if the function's name is "isWindows". |
| JSFunction* function = exec->function(); |
| if (!function) |
| return false; |
| DEFINE_STATIC_LOCAL(const Identifier, isWindowsFunctionName, (exec, "isWindows")); |
| if (function->functionName() != isWindowsFunctionName) |
| return false; |
| |
| // Do the quirk only if the function is called by an "isSafari" function. |
| // However, that function is not itself named -- it is stored in the isSafari |
| // property, though, so that's how we recognize it. |
| ExecState* callingExec = exec->callingExecState(); |
| if (!callingExec) |
| return false; |
| JSFunction* callingFunction = callingExec->function(); |
| if (!callingFunction) |
| return false; |
| JSObject* thisObject = callingExec->thisValue(); |
| if (!thisObject) |
| return false; |
| DEFINE_STATIC_LOCAL(const Identifier, isSafariFunction, (exec, "isSafari")); |
| JSValuePtr isSafariFunction = thisObject->getDirect(isSafariFunctionName); |
| if (isSafariFunction != callingFunction) |
| return false; |
| |
| Document* document = frame->document(); |
| // FIXME: The document is never null, so we should remove this check along with the |
| // other similar ones in this file when we are absolutely sure it's safe. |
| if (!document) |
| return false; |
| |
| // Do the quirk only on the front page of the global version of YouTube. |
| const KURL& url = document->url(); |
| if (url.host() != "youtube.com" && url.host() != "www.youtube.com") |
| return false; |
| if (url.path() != "/") |
| return false; |
| |
| // As with other site-specific quirks, allow website developers to turn this off. |
| // In theory, this allows website developers to check if their fixes are effective. |
| Settings* settings = frame->settings(); |
| if (!settings) |
| return false; |
| if (!settings->needsSiteSpecificQuirks()) |
| return false; |
| |
| return true; |
| } |
| |
| #endif |
| |
| JSValuePtr JSNavigator::appVersion(ExecState* exec) const |
| { |
| Navigator* imp = static_cast<Navigator*>(impl()); |
| Frame* frame = imp->frame(); |
| if (!frame) |
| return jsString(exec, ""); |
| |
| if (needsYouTubeQuirk(exec, frame)) |
| return jsString(exec, ""); |
| return jsString(exec, imp->appVersion()); |
| } |
| |
| void JSNavigator::mark() |
| { |
| Base::mark(); |
| |
| JSGlobalData& globalData = *Heap::heap(this)->globalData(); |
| |
| markDOMObjectWrapper(globalData, impl()->optionalGeolocation()); |
| } |
| |
| } |