WebCore:
authorweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 Feb 2008 23:04:40 +0000 (23:04 +0000)
committerweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 Feb 2008 23:04:40 +0000 (23:04 +0000)
        Reviewed by Darin and Geoff.

        - <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack

        * WebCore.base.exp: Updated.

        * bindings/js/kjs_navigator.cpp:
        (WebCore::needsYouTubeQuirk): Added. Return true on Windows only when the quirk is needed.
        (WebCore::Navigator::getValueProperty): For the appVersion property, if needsYouTubeQuirk
        return true, then return the empty string.

        * page/Settings.cpp:
        (WebCore::Settings::Settings): Set m_needsSiteSpecificQuirks to false.
        (WebCore::Settings::setNeedsSiteSpecificQuirks): Added.
        * page/Settings.h: Added m_needsSiteSpecificQuirks.
        (WebCore::Settings::needsSiteSpecificQuirks): Added.

WebKit/mac:

        Reviewed by Darin and Geoff.

        - WebKit part of <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack

        * WebView/WebView.mm:
        (-[WebView _preferencesChangedNotification:]): Added a call to Settings::setNeedsSiteSpecificQuirks.
        There are currently no site-specific quirks on Mac, but we will propagate the state
        to WebCore to avoid possible mistakes later.

WebKit/win:

        Reviewed by Darin and Geoff.

        - WebKit part of <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack

        * WebView.cpp:
        (WebView::notifyPreferencesChanged): Added a call to Settings::setNeedsSiteSpecificQuirks.
        (WebView::setAllowSiteSpecificHacks): Added a comment about the problem Darin noticed, where
        after you disable the site-specific hacks they persist until you open a new window or tweak
        some other preference.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@30433 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/WebCore.base.exp
WebCore/bindings/js/kjs_navigator.cpp
WebCore/page/Settings.cpp
WebCore/page/Settings.h
WebKit/mac/ChangeLog
WebKit/mac/WebView/WebView.mm
WebKit/win/ChangeLog
WebKit/win/WebView.cpp

index b055dcdfd1ecdc41b6c1812bd60543a02e85ea3f..baf4a7f58ec5b26f88bf7bd69d58ffc8b0a3ba7b 100644 (file)
@@ -1,3 +1,22 @@
+2008-02-20  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Darin and Geoff.
+
+        - <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack
+
+        * WebCore.base.exp: Updated.
+
+        * bindings/js/kjs_navigator.cpp:
+        (WebCore::needsYouTubeQuirk): Added. Return true on Windows only when the quirk is needed.
+        (WebCore::Navigator::getValueProperty): For the appVersion property, if needsYouTubeQuirk
+        return true, then return the empty string.
+
+        * page/Settings.cpp:
+        (WebCore::Settings::Settings): Set m_needsSiteSpecificQuirks to false.
+        (WebCore::Settings::setNeedsSiteSpecificQuirks): Added.
+        * page/Settings.h: Added m_needsSiteSpecificQuirks.
+        (WebCore::Settings::needsSiteSpecificQuirks): Added.
+
 2008-02-20  David Hyatt  <hyatt@apple.com>
 
         Fix for bug 12751, doctype nodes aren't part of the Document (Acid3).
index 1b5cf3245904100d62bc24b67aa625deedaf5616..7fb971a4d53b4ee4fcc2044ef0c500a6e20fa12e 100644 (file)
@@ -489,6 +489,7 @@ __ZN7WebCore8Settings25setPrivateBrowsingEnabledEb
 __ZN7WebCore8Settings25setShouldPrintBackgroundsEb
 __ZN7WebCore8Settings25setUserStyleSheetLocationERKNS_4KURLE
 __ZN7WebCore8Settings26setDefaultTextEncodingNameERKNS_6StringE
+__ZN7WebCore8Settings26setNeedsSiteSpecificQuirksEb
 __ZN7WebCore8Settings27setFTPDirectoryTemplatePathERKNS_6StringE
 __ZN7WebCore8Settings27setLoadsImagesAutomaticallyEb
 __ZN7WebCore8Settings28setForceFTPDirectoryListingsEb
index c57a863e3424c00ca61e81597a35274111e67574..90fa6d132bf9b3c0b3b1ed292d0f7bce2eb078b5 100644 (file)
@@ -186,6 +186,74 @@ bool Navigator::getOwnPropertySlot(ExecState* exec, const Identifier& propertyNa
   return getStaticPropertySlot<Navigator, JSObject>(exec, &NavigatorTable, this, propertyName, slot);
 }
 
+static bool needsYouTubeQuirk(ExecState*, Frame*);
+
+#if !PLATFORM(WIN)
+
+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".
+    FunctionImp* function = exec->function();
+    if (!function)
+        return false;
+    static const Identifier& isWindowsFunctionName = *new Identifier("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 recognize it.
+    ExecState* callingExec = exec->callingExecState();
+    if (!callingExec)
+        return false;
+    FunctionImp* callingFunction = callingExec->function();
+    if (!callingFunction)
+        return false;
+    JSObject* thisObject = callingExec->thisValue();
+    if (!thisObject)
+        return false;
+    static const Identifier& isSafariFunctionName = *new Identifier("isSafari");
+    JSValue* isSafariFunction = thisObject->getDirect(isSafariFunctionName);
+    if (isSafariFunction != callingFunction)
+        return false;
+
+    // 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.
+    Document* document = frame->document(); 
+    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
+
 JSValue* Navigator::getValueProperty(ExecState* exec, int token) const
 {
   switch (token) {
@@ -194,6 +262,8 @@ JSValue* Navigator::getValueProperty(ExecState* exec, int token) const
   case AppName:
     return jsString("Netscape");
   case AppVersion: {
+    if (needsYouTubeQuirk(exec, m_frame))
+        return jsString("");
     // Version is everything in the user agent string past the "Mozilla/" prefix.
     const String userAgent = m_frame->loader()->userAgent(m_frame->document() ? m_frame->document()->url() : KURL());
     return jsString(userAgent.substring(userAgent.find('/') + 1));
index e0c0406e23c6467d11b5f66f6848ad91821e0054..52531173b67c92524ff6f1db77d3f07928112971 100644 (file)
@@ -69,6 +69,7 @@ Settings::Settings(Page* page)
     , m_forceFTPDirectoryListings(false)
     , m_developerExtrasEnabled(false)
     , m_authorAndUserStylesEnabled(true)
+    , m_needsSiteSpecificQuirks(false)
     , m_fontRenderingMode(0)
 {
     // A Frame may not have been created yet, so we initialize the AtomicString 
@@ -317,4 +318,9 @@ FontRenderingMode Settings::fontRenderingMode() const
     return static_cast<FontRenderingMode>(m_fontRenderingMode);
 }
 
+void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks)
+{
+    m_needsSiteSpecificQuirks = needsQuirks;
+}
+
 } // namespace WebCore
index 0e5abc621d5330438cb18a969a6dc50f165e75b0..704b48679f8e81c3fda1cfc32a00fca703d5d6b8 100644 (file)
@@ -146,6 +146,9 @@ namespace WebCore {
         void setFontRenderingMode(FontRenderingMode mode);
         FontRenderingMode fontRenderingMode() const;
 
+        void setNeedsSiteSpecificQuirks(bool);
+        bool needsSiteSpecificQuirks() const { return m_needsSiteSpecificQuirks; }
+
     private:
         Page* m_page;
         
@@ -181,6 +184,7 @@ namespace WebCore {
         bool m_forceFTPDirectoryListings : 1;
         bool m_developerExtrasEnabled : 1;
         bool m_authorAndUserStylesEnabled : 1;
+        bool m_needsSiteSpecificQuirks : 1;
         unsigned m_fontRenderingMode : 1;
     };
 
index 8679ebb94ea50983c856f7bed35a4eda71fa1980..2f5f439219727f4707dd0c0becf686481a6c57bb 100644 (file)
@@ -1,3 +1,14 @@
+2008-02-20  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Darin and Geoff.
+
+        - WebKit part of <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack
+
+        * WebView/WebView.mm:
+        (-[WebView _preferencesChangedNotification:]): Added a call to Settings::setNeedsSiteSpecificQuirks.
+        There are currently no site-specific quirks on Mac, but we will propagate the state
+        to WebCore to avoid possible mistakes later.
+
 2008-02-19  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Darin.
index 354ba524d3129f701580bbe1a7f45deb98d12f8f..8a79cec6291c0b05c0267c5681d7b13c97e193cc 100644 (file)
@@ -979,6 +979,7 @@ static bool debugWidget = true;
         settings->setUserStyleSheetLocation([NSURL URLWithString:@""]);
     settings->setNeedsAdobeFrameReloadingQuirk([self _needsAdobeFrameReloadingQuirk]);
     settings->setNeedsKeyboardEventDisambiguationQuirks([self _needsKeyboardEventDisambiguationQuirks]);
+    settings->setNeedsSiteSpecificQuirks(_private->useSiteSpecificSpoofing);
 }
 
 static inline IMP getMethod(id o, SEL s)
index c7827cda618c8649f5df540cec5b99950c75eb2a..9228fc44f468700e09ef738cd5d7a7ca3bc57df9 100644 (file)
@@ -1,3 +1,15 @@
+2008-02-20  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Darin and Geoff.
+
+        - WebKit part of <rdar://problem/5754378> work around missing video on YouTube front page with a site-specific hack
+
+        * WebView.cpp:
+        (WebView::notifyPreferencesChanged): Added a call to Settings::setNeedsSiteSpecificQuirks.
+        (WebView::setAllowSiteSpecificHacks): Added a comment about the problem Darin noticed, where
+        after you disable the site-specific hacks they persist until you open a new window or tweak
+        some other preference.
+
 2008-02-19  Darin Adler  <darin@apple.com>
 
         Reviewed by Sam.
index cdd712e4e2ec181d6601fe11f9710ce81ebd0bd6..545ea5ecb952043777c8c56d4846cccb90242126 100644 (file)
@@ -3901,6 +3901,7 @@ HRESULT WebView::notifyPreferencesChanged(IWebNotification* notification)
     settings->setShowsURLsInToolTips(false);
     settings->setForceFTPDirectoryListings(true);
     settings->setDeveloperExtrasEnabled(developerExtrasEnabled());
+    settings->setNeedsSiteSpecificQuirks(s_allowSiteSpecificHacks);
 
     FontSmoothingType smoothingType;
     hr = preferences->fontSmoothing(&smoothingType);
@@ -4198,6 +4199,8 @@ HRESULT STDMETHODCALLTYPE WebView::setAllowSiteSpecificHacks(
     /* [in] */ BOOL allow)
 {
     s_allowSiteSpecificHacks = !!allow;
+    // FIXME: This sets a global so it needs to call notifyPreferencesChanged
+    // on all WebView objects (not just itself).
     return S_OK;
 }