From 44d980ff67867cb65bfe8035326be2b461ca7172 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 10 Aug 2015 16:56:53 +0200 Subject: Rebasing on Chromium 45 Fixing the minor differences needed to work with Chromium 45. Change-Id: I5036b4b9a069d45e8dd37e24fab84cdfe5e67acc Reviewed-by: Joerg Bornemann --- src/3rdparty | 2 +- src/core/delegated_frame_node.cpp | 20 ++++++++++---------- src/core/dev_tools_http_handler_delegate_qt.cpp | 1 - src/core/dev_tools_http_handler_delegate_qt.h | 1 - src/core/gl_surface_qt.cpp | 4 ++-- src/core/gl_surface_qt.h | 2 +- src/core/network_delegate_qt.cpp | 5 ----- src/core/network_delegate_qt.h | 1 - src/core/permission_manager_qt.cpp | 12 ++++++++---- src/core/permission_manager_qt.h | 4 ++-- src/core/proxy_config_service_qt.h | 2 +- src/core/render_widget_host_view_qt.cpp | 2 +- src/core/renderer/content_renderer_client_qt.cpp | 2 +- src/core/web_contents_adapter.cpp | 12 ++++++------ src/core/web_contents_delegate_qt.cpp | 7 ++++--- src/core/web_contents_delegate_qt.h | 6 ++++-- tools/scripts/take_snapshot.py | 11 ++++++++--- tools/scripts/version_resolver.py | 4 ++-- 18 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/3rdparty b/src/3rdparty index 4140f5c53..de3c0c8c1 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 4140f5c535bd1626c06c6be122da6b97e2a737bb +Subproject commit de3c0c8c1a76b00c39db824ff43d88523ef24a13 diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp index dee381e15..aebdfd027 100644 --- a/src/core/delegated_frame_node.cpp +++ b/src/core/delegated_frame_node.cpp @@ -165,9 +165,9 @@ static QSGNode *buildLayerChain(QSGNode *chainParent, const cc::SharedQuadState layerChain->appendChildNode(clipNode); layerChain = clipNode; } - if (!layerState->content_to_target_transform.IsIdentity()) { + if (!layerState->quad_to_target_transform.IsIdentity()) { QSGTransformNode *transformNode = new QSGTransformNode; - transformNode->setMatrix(toQt(layerState->content_to_target_transform.matrix())); + transformNode->setMatrix(toQt(layerState->quad_to_target_transform.matrix())); layerChain->appendChildNode(transformNode); layerChain = transformNode; } @@ -571,7 +571,7 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData, break; } case cc::DrawQuad::TEXTURE_CONTENT: { const cc::TextureDrawQuad *tquad = cc::TextureDrawQuad::MaterialCast(quad); - ResourceHolder *resource = findAndHoldResource(tquad->resource_id, resourceCandidates); + ResourceHolder *resource = findAndHoldResource(tquad->resource_id(), resourceCandidates); QSGSimpleTextureNode *textureNode = new QSGSimpleTextureNode; textureNode->setTextureCoordinatesTransform(tquad->y_flipped ? QSGSimpleTextureNode::MirrorVertically : QSGSimpleTextureNode::NoTransform); @@ -619,7 +619,7 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData, break; } case cc::DrawQuad::TILED_CONTENT: { const cc::TileDrawQuad *tquad = cc::TileDrawQuad::MaterialCast(quad); - ResourceHolder *resource = findAndHoldResource(tquad->resource_id, resourceCandidates); + ResourceHolder *resource = findAndHoldResource(tquad->resource_id(), resourceCandidates); QSGSimpleTextureNode *textureNode = new QSGSimpleTextureNode; textureNode->setRect(toQt(quad->rect)); @@ -630,13 +630,13 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData, break; } case cc::DrawQuad::YUV_VIDEO_CONTENT: { const cc::YUVVideoDrawQuad *vquad = cc::YUVVideoDrawQuad::MaterialCast(quad); - ResourceHolder *yResource = findAndHoldResource(vquad->y_plane_resource_id, resourceCandidates); - ResourceHolder *uResource = findAndHoldResource(vquad->u_plane_resource_id, resourceCandidates); - ResourceHolder *vResource = findAndHoldResource(vquad->v_plane_resource_id, resourceCandidates); + ResourceHolder *yResource = findAndHoldResource(vquad->y_plane_resource_id(), resourceCandidates); + ResourceHolder *uResource = findAndHoldResource(vquad->u_plane_resource_id(), resourceCandidates); + ResourceHolder *vResource = findAndHoldResource(vquad->v_plane_resource_id(), resourceCandidates); ResourceHolder *aResource = 0; // This currently requires --enable-vp8-alpha-playback and needs a video with alpha data to be triggered. - if (vquad->a_plane_resource_id) - aResource = findAndHoldResource(vquad->a_plane_resource_id, resourceCandidates); + if (vquad->a_plane_resource_id()) + aResource = findAndHoldResource(vquad->a_plane_resource_id(), resourceCandidates); YUVVideoNode *videoNode = new YUVVideoNode( initAndHoldTexture(yResource, quad->ShouldDrawWithBlending()), @@ -651,7 +651,7 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData, #ifdef GL_OES_EGL_image_external } case cc::DrawQuad::STREAM_VIDEO_CONTENT: { const cc::StreamVideoDrawQuad *squad = cc::StreamVideoDrawQuad::MaterialCast(quad); - ResourceHolder *resource = findAndHoldResource(squad->resource_id, resourceCandidates); + ResourceHolder *resource = findAndHoldResource(squad->resource_id(), resourceCandidates); MailboxTexture *texture = static_cast(initAndHoldTexture(resource, quad->ShouldDrawWithBlending())); texture->setTarget(GL_TEXTURE_EXTERNAL_OES); // since this is not default TEXTURE_2D type diff --git a/src/core/dev_tools_http_handler_delegate_qt.cpp b/src/core/dev_tools_http_handler_delegate_qt.cpp index 2afd75e6e..793ed0981 100644 --- a/src/core/dev_tools_http_handler_delegate_qt.cpp +++ b/src/core/dev_tools_http_handler_delegate_qt.cpp @@ -62,7 +62,6 @@ #include "content/public/common/content_switches.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" -#include "net/socket/stream_listen_socket.h" #include "net/socket/tcp_server_socket.h" using namespace content; diff --git a/src/core/dev_tools_http_handler_delegate_qt.h b/src/core/dev_tools_http_handler_delegate_qt.h index b998359fd..0fe9ad0ce 100644 --- a/src/core/dev_tools_http_handler_delegate_qt.h +++ b/src/core/dev_tools_http_handler_delegate_qt.h @@ -39,7 +39,6 @@ #include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_manager_delegate.h" -#include "net/socket/stream_listen_socket.h" #include #include // needed for Q_DECL_OVERRIDE diff --git a/src/core/gl_surface_qt.cpp b/src/core/gl_surface_qt.cpp index c905688ce..d3bad4926 100644 --- a/src/core/gl_surface_qt.cpp +++ b/src/core/gl_surface_qt.cpp @@ -439,11 +439,11 @@ bool GLSurfaceQt::IsOffscreen() return true; } -bool GLSurfaceQt::SwapBuffers() +gfx::SwapResult GLSurfaceQt::SwapBuffers() { LOG(ERROR) << "Attempted to call SwapBuffers on a pbuffer."; Q_UNREACHABLE(); - return false; + return gfx::SwapResult::SWAP_FAILED; } gfx::Size GLSurfaceQt::GetSize() diff --git a/src/core/gl_surface_qt.h b/src/core/gl_surface_qt.h index 4b5da207e..7646063b2 100644 --- a/src/core/gl_surface_qt.h +++ b/src/core/gl_surface_qt.h @@ -56,7 +56,7 @@ public: virtual void* GetDisplay() Q_DECL_OVERRIDE; virtual void* GetConfig() Q_DECL_OVERRIDE; virtual bool IsOffscreen() Q_DECL_OVERRIDE; - virtual bool SwapBuffers() Q_DECL_OVERRIDE; + virtual gfx::SwapResult SwapBuffers() Q_DECL_OVERRIDE; virtual gfx::Size GetSize() Q_DECL_OVERRIDE; protected: diff --git a/src/core/network_delegate_qt.cpp b/src/core/network_delegate_qt.cpp index 5af781007..d79f6e609 100644 --- a/src/core/network_delegate_qt.cpp +++ b/src/core/network_delegate_qt.cpp @@ -285,11 +285,6 @@ bool NetworkDelegateQt::OnCanAccessFile(const net::URLRequest& request, const ba return true; } -bool NetworkDelegateQt::OnCanThrottleRequest(const net::URLRequest&) const -{ - return false; -} - bool NetworkDelegateQt::OnCanEnablePrivacyMode(const GURL&, const GURL&) const { return false; diff --git a/src/core/network_delegate_qt.h b/src/core/network_delegate_qt.h index 1176f99d9..41b5b98b6 100644 --- a/src/core/network_delegate_qt.h +++ b/src/core/network_delegate_qt.h @@ -87,7 +87,6 @@ public: virtual net::NetworkDelegate::AuthRequiredResponse OnAuthRequired(net::URLRequest*, const net::AuthChallengeInfo&, const AuthCallback&, net::AuthCredentials*) override; virtual bool OnCanGetCookies(const net::URLRequest&, const net::CookieList&) override; virtual bool OnCanAccessFile(const net::URLRequest& request, const base::FilePath& path) const override; - virtual bool OnCanThrottleRequest(const net::URLRequest&) const override; virtual bool OnCanEnablePrivacyMode(const GURL&, const GURL&) const override; virtual bool OnFirstPartyOnlyCookieExperimentEnabled() const override; virtual bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(const net::URLRequest&, const GURL&, const GURL&) const override; diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index 865874fe6..d89b530ee 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -36,7 +36,10 @@ #include "permission_manager_qt.h" +#include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/public/browser/permission_type.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "type_conversion.h" @@ -90,7 +93,7 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &origin, BrowserCont } void PermissionManagerQt::RequestPermission(content::PermissionType permission, - content::WebContents* web_contents, + content::RenderFrameHost *frameHost, int request_id, const GURL& requesting_origin, bool user_gesture, @@ -103,7 +106,8 @@ void PermissionManagerQt::RequestPermission(content::PermissionType permission, return; } - WebContentsDelegateQt* contentsDelegate = static_cast(web_contents->GetDelegate()); + content::WebContents *webContents = frameHost->GetRenderViewHost()->GetDelegate()->GetAsWebContents(); + WebContentsDelegateQt* contentsDelegate = static_cast(webContents->GetDelegate()); Q_ASSERT(contentsDelegate); Request request = { request_id, @@ -117,11 +121,11 @@ void PermissionManagerQt::RequestPermission(content::PermissionType permission, } void PermissionManagerQt::CancelPermissionRequest(content::PermissionType permission, - content::WebContents* web_contents, + content::RenderFrameHost *frameHost, int request_id, const GURL& requesting_origin) { - Q_UNUSED(web_contents); + Q_UNUSED(frameHost); const BrowserContextAdapter::PermissionType permissionType = toQt(permission); if (permissionType == BrowserContextAdapter::UnsupportedPermission) return; diff --git a/src/core/permission_manager_qt.h b/src/core/permission_manager_qt.h index 75f88f9a9..d4ee72bae 100644 --- a/src/core/permission_manager_qt.h +++ b/src/core/permission_manager_qt.h @@ -58,7 +58,7 @@ public: // content::PermissionManager implementation: void RequestPermission( content::PermissionType permission, - content::WebContents* web_contents, + content::RenderFrameHost* render_frame_host, int request_id, const GURL& requesting_origin, bool user_gesture, @@ -66,7 +66,7 @@ public: void CancelPermissionRequest( content::PermissionType permission, - content::WebContents* web_contents, + content::RenderFrameHost* render_frame_host, int request_id, const GURL& requesting_origin) override; diff --git a/src/core/proxy_config_service_qt.h b/src/core/proxy_config_service_qt.h index f2f06d3fa..ee4263314 100644 --- a/src/core/proxy_config_service_qt.h +++ b/src/core/proxy_config_service_qt.h @@ -72,7 +72,7 @@ private: void RegisterObserver(); scoped_ptr m_baseService; - ObserverList m_observers; + base::ObserverList m_observers; // Keep the last QNetworkProxy::applicationProxy state around. QNetworkProxy m_qtApplicationProxy; diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index ef6610ecb..f2a8055ad 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -806,7 +806,7 @@ QVariant RenderWidgetHostViewQt::inputMethodQuery(Qt::InputMethodQuery query) co void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) { Q_UNUSED(touch); const bool eventConsumed = ack_result == content::INPUT_EVENT_ACK_STATE_CONSUMED; - m_gestureProvider.OnAsyncTouchEventAck(eventConsumed); + m_gestureProvider.OnTouchEventAck(touch.event.uniqueTouchEventId, eventConsumed); } void RenderWidgetHostViewQt::sendDelegatedFrameAck() diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 32ba4d55f..8f239fc73 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -111,7 +111,7 @@ bool ContentRendererClientQt::ShouldSuppressErrorPage(content::RenderFrame *fram void ContentRendererClientQt::GetNavigationErrorStrings(content::RenderView* renderView, blink::WebFrame *frame, const blink::WebURLRequest &failedRequest, const blink::WebURLError &error, std::string *errorHtml, base::string16 *errorDescription) { Q_UNUSED(frame) - const bool isPost = EqualsASCII(failedRequest.httpMethod(), "POST"); + const bool isPost = base::EqualsASCII(failedRequest.httpMethod(), "POST"); if (errorHtml) { // Use a local error page. diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index ae4eabe74..cb9cb012b 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -209,7 +209,7 @@ static void serializeNavigationHistory(const content::NavigationController &cont } } -static void deserializeNavigationHistory(QDataStream &input, int *currentIndex, std::vector *entries, content::BrowserContext *browserContext) +static void deserializeNavigationHistory(QDataStream &input, int *currentIndex, ScopedVector *entries, content::BrowserContext *browserContext) { int version; input >> version; @@ -250,13 +250,13 @@ static void deserializeNavigationHistory(QDataStream &input, int *currentIndex, // If we couldn't unpack the entry successfully, abort everything. if (input.status() != QDataStream::Ok) { *currentIndex = -1; - Q_FOREACH (content::NavigationEntry *entry, *entries) + for (content::NavigationEntry *entry : *entries) delete entry; entries->clear(); return; } - content::NavigationEntry *entry = content::NavigationController::CreateNavigationEntry( + scoped_ptr entry = content::NavigationController::CreateNavigationEntry( toGurl(virtualUrl), content::Referrer(toGurl(referrerUrl), static_cast(referrerPolicy)), // Use a transition type of reload so that we don't incorrectly @@ -275,7 +275,7 @@ static void deserializeNavigationHistory(QDataStream &input, int *currentIndex, entry->SetIsOverridingUserAgent(isOverridingUserAgent); entry->SetTimestamp(base::Time::FromInternalValue(timestamp)); entry->SetHttpStatusCode(httpStatusCode); - entries->push_back(entry); + entries->push_back(entry.release()); } } @@ -320,7 +320,7 @@ WebContentsAdapterPrivate::~WebContentsAdapterPrivate() QExplicitlySharedDataPointer WebContentsAdapter::createFromSerializedNavigationHistory(QDataStream &input, WebContentsAdapterClient *adapterClient) { int currentIndex; - std::vector entries; + ScopedVector entries; deserializeNavigationHistory(input, ¤tIndex, &entries, adapterClient->browserContextAdapter()->browserContext()); if (currentIndex == -1) @@ -395,7 +395,7 @@ void WebContentsAdapter::initialize(WebContentsAdapterClient *adapterClient) content::RenderViewHost *rvh = d->webContents->GetRenderViewHost(); Q_ASSERT(rvh); if (!rvh->IsRenderViewLive()) - static_cast(d->webContents.get())->CreateRenderViewForRenderManager(rvh, MSG_ROUTING_NONE, MSG_ROUTING_NONE, true); + static_cast(d->webContents.get())->CreateRenderViewForRenderManager(rvh, MSG_ROUTING_NONE, MSG_ROUTING_NONE, content::FrameReplicationState(), true); } void WebContentsAdapter::reattachRWHV() diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 93fabf15a..e644d691f 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -172,13 +172,14 @@ void WebContentsDelegateQt::DidCommitProvisionalLoadForFrame(content::RenderFram m_viewClient->loadCommitted(); } -void WebContentsDelegateQt::DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, const base::string16& error_description) +void WebContentsDelegateQt::DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, const base::string16& error_description, bool was_ignored_by_handler) { - DidFailLoad(render_frame_host, validated_url, error_code, error_description); + DidFailLoad(render_frame_host, validated_url, error_code, error_description, was_ignored_by_handler); } -void WebContentsDelegateQt::DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, const base::string16& error_description) +void WebContentsDelegateQt::DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, const base::string16& error_description, bool was_ignored_by_handler) { + Q_UNUSED(was_ignored_by_handler); if (m_loadingErrorFrameList.removeOne(render_frame_host->GetRoutingID()) || render_frame_host->GetParent()) return; diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index b983738e9..1728c447d 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -95,8 +95,10 @@ public: // WebContentsObserver overrides virtual void DidStartProvisionalLoadForFrame(content::RenderFrameHost *render_frame_host, const GURL &validated_url, bool is_error_page, bool is_iframe_srcdoc) Q_DECL_OVERRIDE; virtual void DidCommitProvisionalLoadForFrame(content::RenderFrameHost *render_frame_host, const GURL &url, ui::PageTransition transition_type) Q_DECL_OVERRIDE; - virtual void DidFailProvisionalLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url, int error_code, const base::string16 &error_description) Q_DECL_OVERRIDE; - virtual void DidFailLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url, int error_code, const base::string16 &error_description) Q_DECL_OVERRIDE; + virtual void DidFailProvisionalLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url, + int error_code, const base::string16 &error_description, bool was_ignored_by_handler) Q_DECL_OVERRIDE; + virtual void DidFailLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url, + int error_code, const base::string16 &error_description, bool was_ignored_by_handler) Q_DECL_OVERRIDE; virtual void DidFinishLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url) Q_DECL_OVERRIDE; virtual void DidUpdateFaviconURL(const std::vector &candidates) Q_DECL_OVERRIDE; virtual void DidNavigateAnyFrame(content::RenderFrameHost *render_frame_host, const content::LoadCommittedDetails &details, const content::FrameNavigateParams ¶ms) Q_DECL_OVERRIDE; diff --git a/tools/scripts/take_snapshot.py b/tools/scripts/take_snapshot.py index 836d230e8..6746ff9c2 100755 --- a/tools/scripts/take_snapshot.py +++ b/tools/scripts/take_snapshot.py @@ -163,6 +163,7 @@ def isInChromiumBlacklist(file_path): or file_path.startswith('third_party/cros_system_api') or file_path.startswith('third_party/cygwin') or file_path.startswith('third_party/cython') + or file_path.startswith('third_party/deqp') or file_path.startswith('third_party/elfutils') or file_path.startswith('third_party/google_input_tools') or file_path.startswith('third_party/gperf') @@ -171,7 +172,7 @@ def isInChromiumBlacklist(file_path): or file_path.startswith('third_party/google_appengine_cloudstorage') or file_path.startswith('third_party/google_toolbox_for_mac') or file_path.startswith('third_party/hunspell_dictionaries') - or file_path.startswith('third_party/hunspell_new') + or file_path.startswith('third_party/hunspell') or file_path.startswith('third_party/instrumented_libraries') or file_path.startswith('third_party/jsr-305/src') or file_path.startswith('third_party/junit') @@ -185,14 +186,15 @@ def isInChromiumBlacklist(file_path): or file_path.startswith('third_party/mingw-w64') or file_path.startswith('third_party/nacl_sdk_binaries') or (file_path.startswith('third_party/polymer') and - not file_path.startswith('third_party/polymer/components-chromium/')) + not file_path.startswith('third_party/polymer/v1_0/components-chromium/')) or file_path.startswith('third_party/pdfsqueeze') or file_path.startswith('third_party/pefile') or file_path.startswith('third_party/perl') or file_path.startswith('third_party/pdfium') or file_path.startswith('third_party/psyco_win32') or file_path.startswith('third_party/scons-2.0.1') - or file_path.startswith('third_party/trace-viewer') + or file_path.startswith('third_party/trace-viewer/tracing/test_data') + or file_path.startswith('third_party/trace-viewer/tracing/third_party/v8') or file_path.startswith('third_party/undoview') or file_path.startswith('third_party/webgl') or (file_path.startswith('tools') and @@ -209,9 +211,12 @@ def isInChromiumBlacklist(file_path): not file_path.startswith('tools/protoc_wrapper')) or file_path.startswith('ui/android/java') or file_path.startswith('ui/app_list') + or file_path.startswith('ui/base/ime/chromeos') or file_path.startswith('ui/chromeos') or file_path.startswith('ui/display/chromeos') + or file_path.startswith('ui/events/ozone/chromeos') or file_path.startswith('ui/file_manager') + or file_path.startswith('ui/gfx/chromeos') ): return True diff --git a/tools/scripts/version_resolver.py b/tools/scripts/version_resolver.py index b223e4fef..3e3f77d62 100644 --- a/tools/scripts/version_resolver.py +++ b/tools/scripts/version_resolver.py @@ -51,8 +51,8 @@ import json import urllib2 import git_submodule as GitSubmodule -chromium_version = '44.0.2403.91' -chromium_branch = '2403' +chromium_version = '45.0.2454.40' +chromium_branch = '2454' ninja_version = 'v1.5.3' json_url = 'http://omahaproxy.appspot.com/all.json' -- cgit v1.2.3