15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_process_policy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const extensions::Extension* GetNonBookmarkAppExtension( 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ExtensionSet& extensions, const GURL& url) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exclude bookmark apps, which do not use the app process model. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension = 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions.GetExtensionOrAppByURL(url); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->from_bookmark()) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = NULL; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CrossesExtensionProcessBoundary( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtensionSet& extensions, 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL& old_url, 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const GURL& new_url, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_consider_workaround) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* old_url_extension = GetNonBookmarkAppExtension( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_url); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* new_url_extension = GetNonBookmarkAppExtension( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_url); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Temporary workaround for crbug.com/59285: Do not swap process 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to navigate from a hosted app to a normal page or another hosted app 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (unless either is the web store). This is because some OAuth providers 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use non-app popups that communicate with non-app iframes inside the app 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g., Facebook). This would require out-of-process iframes to support. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/99379. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we skip this exception for isolated apps, which require strict 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process separation from non-app pages. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_consider_workaround) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_url_is_hosted_app = old_url_extension && 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !old_url_extension->web_extent().is_empty() && 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !AppIsolationInfo::HasIsolatedStorage(old_url_extension); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool new_url_is_normal_or_hosted = !new_url_extension || 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!new_url_extension->web_extent().is_empty() && 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !AppIsolationInfo::HasIsolatedStorage(new_url_extension)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool either_is_web_store = 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_url_extension && 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci old_url_extension->id() == extensions::kWebStoreAppId) || 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_url_extension && 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new_url_extension->id() == extensions::kWebStoreAppId); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_url_is_hosted_app && 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_url_is_normal_or_hosted && 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !either_is_web_store) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return old_url_extension != new_url_extension; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 67