[chromium] Add ability to override user agent string per-WebFrameClient
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 May 2012 03:44:23 +0000 (03:44 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 May 2012 03:44:23 +0000 (03:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=83959

Patch by Dan Alcantara <dfalcantara@chromium.org> on 2012-05-09
Reviewed by Adam Barth.

Adds a method that can be used to override the normal user agent in
chromium.  Also adds a unit test to check if the override is taking effect.

* WebKit.gypi:
* public/WebFrameClient.h:
(WebFrameClient):
(WebKit::WebFrameClient::userAgent):
* src/FrameLoaderClientImpl.cpp:
(WebKit::FrameLoaderClientImpl::userAgent):
* tests/FrameLoaderClientImplTest.cpp: Added.
(WebKit):
(TestWebFrameClient):
(WebKit::TestWebFrameClient::setUserAgentOverride):
(FrameLoaderClientImplTest):
(WebKit::FrameLoaderClientImplTest::SetUp):
(WebKit::FrameLoaderClientImplTest::TearDown):
(WebKit::FrameLoaderClientImplTest::setUserAgentOverride):
(WebKit::FrameLoaderClientImplTest::userAgent):
(WebKit::TEST_F):

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

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gypi
Source/WebKit/chromium/public/WebFrameClient.h
Source/WebKit/chromium/src/FrameLoaderClientImpl.cpp
Source/WebKit/chromium/tests/FrameLoaderClientImplTest.cpp [new file with mode: 0644]

index 3d1875e..c962d4f 100644 (file)
@@ -1,3 +1,30 @@
+2012-05-09  Dan Alcantara  <dfalcantara@chromium.org>
+
+        [chromium] Add ability to override user agent string per-WebFrameClient
+        https://bugs.webkit.org/show_bug.cgi?id=83959
+        
+        Reviewed by Adam Barth.
+        
+        Adds a method that can be used to override the normal user agent in
+        chromium.  Also adds a unit test to check if the override is taking effect.
+
+        * WebKit.gypi:
+        * public/WebFrameClient.h:
+        (WebFrameClient):
+        (WebKit::WebFrameClient::userAgent):
+        * src/FrameLoaderClientImpl.cpp:
+        (WebKit::FrameLoaderClientImpl::userAgent):
+        * tests/FrameLoaderClientImplTest.cpp: Added.
+        (WebKit):
+        (TestWebFrameClient):
+        (WebKit::TestWebFrameClient::setUserAgentOverride):
+        (FrameLoaderClientImplTest):
+        (WebKit::FrameLoaderClientImplTest::SetUp):
+        (WebKit::FrameLoaderClientImplTest::TearDown):
+        (WebKit::FrameLoaderClientImplTest::setUserAgentOverride):
+        (WebKit::FrameLoaderClientImplTest::userAgent):
+        (WebKit::TEST_F):
+
 2012-05-09  Ian Vollick  <vollick@chromium.org>
 
         [chromium] Ensure animations get ticked at least once when added.
index b2cccea..fc26747 100644 (file)
             'tests/FakeGraphicsContext3DTest.cpp',
             'tests/FakeWebGraphicsContext3D.h',
             'tests/FloatQuadTest.cpp',
+            'tests/FrameLoaderClientImplTest.cpp',
             'tests/FrameTestHelpers.cpp',
             'tests/FrameTestHelpers.h',
             'tests/IDBBindingUtilitiesTest.cpp',
index 9270d1a..662c7c1 100644 (file)
@@ -397,6 +397,11 @@ public:
         WebSecurityOrigin target,
         WebDOMMessageEvent) { return false; }
 
+    // Asks the embedder if a specific user agent should be used for the given
+    // URL. Returns true if it should, along with the user agent. If false,
+    // WebKitPlatformSupport::userAgent() will be called to provide one.
+    virtual bool userAgent(const WebURL& url, WebString* userAgent) { return false; }
+
 protected:
     ~WebFrameClient() { }
 };
index 8da533c..ece4ed3 100644 (file)
@@ -1383,6 +1383,10 @@ void FrameLoaderClientImpl::setTitle(const StringWithDirection& title, const KUR
 
 String FrameLoaderClientImpl::userAgent(const KURL& url)
 {
+    WebString override;
+    if (m_webFrame->client()->userAgent(WebURL(url), &override))
+        return override;
+
     return WebKit::Platform::current()->userAgent(url);
 }
 
diff --git a/Source/WebKit/chromium/tests/FrameLoaderClientImplTest.cpp b/Source/WebKit/chromium/tests/FrameLoaderClientImplTest.cpp
new file mode 100644 (file)
index 0000000..e01c1ba
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "FrameLoaderClientImpl.h"
+
+#include "KURL.h"
+#include "WebFrameClient.h"
+#include "WebFrameImpl.h"
+#include "WebView.h"
+
+#include <gtest/gtest.h>
+#include <wtf/text/WTFString.h>
+
+using namespace WebKit;
+
+namespace {
+
+class TestWebFrameClient : public WebFrameClient {
+public:
+    bool userAgent(const WebURL& url, WebString* userAgent) OVERRIDE
+    {
+        if (m_userAgentOverride.isEmpty())
+            return false;
+
+        *userAgent = m_userAgentOverride;
+        return true;
+    }
+
+    void setUserAgentOverride(const WebString& userAgent)
+    {
+        m_userAgentOverride = userAgent;
+    }
+
+private:
+    WebString m_userAgentOverride;
+};
+
+class FrameLoaderClientImplTest : public testing::Test {
+public:
+    void SetUp()
+    {
+        m_webView = WebView::create(0);
+        m_webView->initializeMainFrame(&m_webFrameClient);
+        WebFrameImpl* frame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
+        m_frameLoaderClientImpl = static_cast<FrameLoaderClientImpl*>(frame->frame()->loader()->client());
+    }
+
+    void TearDown()
+    {
+        m_webView->close();
+    }
+
+    void setUserAgentOverride(const WebString& userAgent)
+    {
+        return m_webFrameClient.setUserAgentOverride(userAgent);
+    }
+
+    const WebString userAgent()
+    {
+        // The test always returns the same user agent, regardless of the URL passed in.
+        const WebCore::KURL dummyURL(WebCore::ParsedURLString, "about:blank");
+        return WebString::fromUTF8(m_frameLoaderClientImpl->userAgent(dummyURL).utf8());
+    }
+
+protected:
+    TestWebFrameClient m_webFrameClient;
+    FrameLoaderClientImpl* m_frameLoaderClientImpl;
+    WebView* m_webView;
+};
+
+TEST_F(FrameLoaderClientImplTest, UserAgentOverride)
+{
+    const WebString defaultUserAgent = userAgent();
+    const WebString override = WebString::fromUTF8("dummy override");
+
+    // Override the user agent and make sure we get it back.
+    setUserAgentOverride(override);
+    EXPECT_TRUE(override.equals(userAgent()));
+
+    // Remove the override and make sure we get the original back.
+    setUserAgentOverride(WebString());
+    EXPECT_TRUE(defaultUserAgent.equals(userAgent()));
+}
+
+} // namespace